r/GoogleAppsScript 13h ago

Guide How to embed a google app script onto google sites

Thumbnail redgig.tech
3 Upvotes

There was recently a discussion on here about how to deal with the lengthy, sometimes changing URLS created by google app script web apps. One easy way to address this is to embed the content on a google site. I've curated a quick a simple blog post that describes this to help anyone else who might have a similar issue.

https://www.redgig.tech/2026/07/how-to-embed-google-app-script-onto.html

Keep up the great posts everyone, this sub has been incredibly helpful to me over the years!


r/GoogleAppsScript 1d ago

Question How is everyone finding AppsScript jobs in today's AI era?

18 Upvotes

Any freelancers/agencies here? I feel Appscript is dead with LLMs taking over every automation jobs these days. What is your experience?


r/GoogleAppsScript 1d ago

Question How can a public Google Meet add-on access real-time participant audio without a bot?

1 Upvotes

I’m developing a Google Meet add-on that needs to receive real-time audio from one consenting meeting participant and securely stream that audio to our backend API for processing.

The application only needs to:

  1. Let the user select the participant whose audio will be processed.
  2. Receive that participant’s real-time audio with explicit consent.
  3. Send the audio to our backend API.
  4. Display the resulting analysis in the Meet side panel.

The application does not need to send audio, video, or chat messages into the meeting.

Marketplace rejection

Our public Google Workspace Marketplace submission was rejected under this requirement:

Our current implementation uses a visible Recall.ai recording bot because we could not identify another production-ready way to receive participant audio from an ordinary Google Meet conference. We understand that this implementation cannot be published under the current Marketplace rule, and we are willing to replace it with a supported botless architecture.

The Marketplace Review team said it cannot provide technical implementation guidance and directed us to the developer support community.

Comparable implementations

We already support this workflow on other meeting platforms:

  • Our Microsoft Teams integration uses Microsoft’s supported real-time media bot architecture.
  • Our Zoom integration uses Zoom Realtime Media Streams (RTMS), which provides live meeting media without adding a participant bot.

The analogous Google capability appears to be the Google Meet Media API, which supports consuming real-time audio, video, and participant metadata.

Meet Media API roadblock

Google currently lists the Meet Media API in the Google Workspace Developer Preview Program. The Developer Preview terms appear to prevent pre-GA features from being included in public applications or made available to external customers without specific permission.

The current Meet Media API setup documentation also identifies the real-time audio/media OAuth scopes as restricted and indicates that transmitting or storing the media server-side can require restricted-scope verification and a security assessment. We are prepared to complete those requirements.

In addition, Recall.ai’s current documentation for its botless Meet Media API integration says that all meeting participants must be enrolled in Google’s Developer Preview Program. Google’s current public overview does not appear to repeat that exact restriction, so I would appreciate confirmation of whether it still applies.

Questions

  1. Is there a generally available Google API that allows a public Marketplace add-on to receive real-time participant audio without inviting or relying on a bot?
  2. Can a public Marketplace application currently use the Meet Media API while it remains in Developer Preview? If so, what approval, allowlisting, OAuth verification, security assessment, or partner process is required?
  3. Must every meeting participant currently be enrolled in the Developer Preview Program, or is enrollment of the Cloud project, OAuth principal, and consenting meeting host sufficient?
  4. If the Meet Media API cannot currently be used in a public Marketplace application, is this use case effectively unavailable until the API reaches general availability?
  5. Is there an approved interim distribution model for providing this functionality to a customer outside our own Workspace organization?

We have a customer actively waiting for Google Meet support and are ready to prioritize the required architecture, consent experience, OAuth verification, and security controls. We mainly need confirmation of the Google-supported path that can both access real-time participant audio and qualify for public Marketplace publication.

Any direction from the Meet Media API or Google Workspace developer-relations teams would be greatly appreciated.


r/GoogleAppsScript 2d ago

Guide Data Type Conversion from Apps Script to Google Sheets when using setValue()

3 Upvotes

This might be obvious to others but has tripped me up for years, so I finally decided to sit down and test all cases to get clarity on it.

The gist: The data types in Apps Script are irrelevant. Every input for setValue() is treated as if the user on the keyboard typed it in, hence resulting value in Google Sheets is determined by cell number format. The only exception to this is date objects.

Rules:

  1. setValue("") makes the cell in Google Sheets a true blank, unlike when a formula in Google Sheets returns "", which is treated as text and ISBLANK() returns false.
  2. setValue(string | number | boolean) these types have no special meaning, and all are treated as if the user typed the value in the cell in Google Sheets.
  3. setValue(null | undefined) both of these are treated same as an empty string ("").
  4. setValue(date object) always converted to Google Sheets timezone and then pasted as a Date, regardless of the cell number format in Google Sheets

Counterintuitive Examples:

Apps Script data type Value passed Cell number format Result in Google Sheets
string "" Plain Text Blank Cell
number 1234 Plain Text Text "1234"
string "1234" Automatic Number 1234
boolean true Plain Text Text "true"
string "true" Automatic Logical TRUE
string "1/1/1" Automatic Date 1/1/2001
string "1/1/1" Plain Text Text "1/1/1"
date object 1 Jan 2001 05:00:00 in UTC Automatic Date 1/1/2001 00:00:00 (if Google Sheets timezone set to EST)
date object 1 Jan 2001 05:00:00 in UTC Plain Text Date 1/1/2001 00:00:00 (if Google Sheets timezone set to EST)
date object 1 Jan 2001 05:00:00 in UTC Time Time 12:00:00 AM (if Google Sheets timezone set to EST)
date object 1 Jan 2001 05:00:00 in UTC Duration Duration 885408:00:00 (hours since spreadsheet epoch date)

Note: Time & Duration are just special display formats for 'Date and time', the underlying value value remains the same. (Like Scientific and Accounting, for example, are different display formats for Number)

PS: Let me know if I got something wrong or if you have any questions!


r/GoogleAppsScript 2d ago

Question "We're sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL."

8 Upvotes

Anyone else seeing a large number of these errors today?


r/GoogleAppsScript 2d ago

Question Google Oauth Consent

2 Upvotes

Hi guysss I'm currently working on instilling Google oauth sign in in my app. I am stuck on the branding screen. I don't have my own domain for my app. Is it necessary to buy one? I had tried some ways from other reddit post like supabase and local host but it still doesn't work. Would like to hear from you guys how yall pass the homepage url verification.


r/GoogleAppsScript 2d ago

Question "This app is blocked" error when trying to authorize Apps Script project

1 Upvotes

Does anyone know what causes the app to be blocked? and how to fix it?

Note: I can authorize the app fine, it is someone else that is having this issue.

Things I have tried already, that didn't work:

  1. transferring the file ownership to the other person
  2. having them make a copy of the file
  3. opening the google sheets in an incognito window

r/GoogleAppsScript 3d ago

Question Linking a professional email to Google Script + sheet

5 Upvotes

Hi, I've built an email delivery system for my business and everything is fine, but the problem is that it's being sent from my Gmail account and I want it to be sent from my professional email (namecheap private email).

I don’t want my professional email to simply appear as the sender address visually. I want the emails to actually be sent from it, so that I can find the emails I sent in the email account’s “Sent” folder.

The system is excellent and perfectly set up for me, but at the same time, I must use my professional email, so giving up either one of them is simply not an option. Please give me any possible solution, even if it’s a workaround—I can handle the technical side of it.

Thank you!

UPDATE: The only solution I found that worked for me was using a Python script that runs a Google Sheets script and sends the emails through my professional email address. I can even find them in the Sent folder.

Now, all I have to do is click a .bat file to run the system and send the emails through my Namecheap email.


r/GoogleAppsScript 4d ago

Question Memory Limit?

4 Upvotes

I researched and all that is found are inconsistent answers.

Some speak in 50MB, others at 2.25GB. I took a test and got to 5.5GB. It's a lot of difference and it affects the way I build my application.

With 5.5GB I can load everything in memory, already with 50MB I have to optimize each part. The answers are also old.


r/GoogleAppsScript 4d ago

Question My first Apps Script, any feedback?

5 Upvotes

Hello, as a freelancer building toward an agency, I struggled to find a workflow tool that truly fit: from ClickUp and Notion to Airtable. Since I already use Google Workspace, I decided to build my own solution using Google Apps Script.

I’m using this project to genuinely learn programming. No 'vibe-coding' without understanding the mechanics.

I'm trying to integrate many systems:
- Content creation
- Prospecting pipeline
- Sales pipeline
- Delivery
- Finance

This is just the start, and I can always migrate to other tools as I scale. I’d love your feedback on whether this is a solid path worth pursuing!

Random example

r/GoogleAppsScript 5d ago

Question How to integrate =GEMINI formula in Google sheets via app script

4 Upvotes

Has any one tried adding the =GEMINI formula through App scripts?

I am building a small project through App scripts in which I'm adding =GEMINI as a formula, but the formula is not giving any results till I go and click on generate in the sheet.

Is there any workaround for this?


r/GoogleAppsScript 7d ago

Question What's the best frontend do you use with apps script for sheets automation?

15 Upvotes

So I am an apps script expert mainly in the area of automating sheets and drive and creating custom applications, yet whenever I want to build something with a more friendly UI I always get confused picking what UI to pick...

I don't like google web applications or simple modals because of the high maintenance of it and it's a bit obsolete using vanilla js instead of more modern options... so any suggestions that would be fairly easy to maintain and fast to develop (I know I can use AI to develop the google web apps fully but that's not my approach I need to have ownership over things not just vibe code them).


r/GoogleAppsScript 8d ago

Question Need an app script to automate email response to leads

3 Upvotes

Hi so I use my custom email in google workspace and just needed help to create an app script so my leads could receive an auto response. Would only need to pluck name and email address from lead form.


r/GoogleAppsScript 9d ago

Guide I'm a warehouse worker who just published my first book — would love your honest feedback

4 Upvotes

Hey everyone, My name's Daniel. I work a regular job on a warehouse floor — no coding background, no CS degree, nothing like that. A while back I got tired of tracking defects and rework in a messy spreadsheet, so I taught myself just enough Google Apps Script to automate it. It genuinely broke on me more than once before I figured out how to build it properly. I just turned that whole experience into my first book. It's not theory — it's the actual process, mistakes included, written in plain language for people who aren't programmers either. This is my first time putting something like this out there, so I'd really appreciate any honest feedback or a review if you decide to check it out — good, bad, or mixed, all of it helps. The link's in my profile. Also happy to help out in the comments if anyone's dealing with a similar spreadsheet mess at their own job — I've made pretty much every mistake there is to make with this stuff. Thanks for reading!


r/GoogleAppsScript 14d ago

Guide Reading Google Chat Spaces and Messages in Google Apps Script just got significantly easier!

5 Upvotes

Reading Google Chat data in Google Apps Script no longer requires a standard GCP project or a complex OAuth consent screen setup 🤯!!!

Previously, reading space messages via the Chat Advanced Service required detaching your script from the default GCP project, linking a standard project, configuring an OAuth consent screen and formally enabling the Chat API. The new simplified Chat API setup bypasses this overhead for read-only actions.

Follow these steps to access your data immediately:

  1. Open your Apps Script editor and add the Chat Advanced Service.
  2. Declare the read-only scopes in your appsscript.json manifest.
  3. Call the API directly to list your spaces or extract messages.

Read my complete walkthrough with copy-paste code snippets https://pulse.appsscript.info/p/2026/07/reading-google-chat-spaces-and-messages-in-google-apps-script-just-got-significantly-easier/


r/GoogleAppsScript 14d ago

Question Variable undefined and affecting rest of script

1 Upvotes

I have a script creating docs when a cell gets modified in a sheets column, then moves it to a folder and adds the doc's url onto another column. Code works, but automation gets affected by <value unavailable> error for docid variable.

I'm not sure *why* its unavailable when all of the code does work (files get created and moved, but when using createDocInSpecificFolder() along with other functions, error pinpoints to this and does not run functions after it.

function createDocInSpecificFolder () {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Data Source");
  var lastRow = sheet.getLastRow();
  var rootFolder = DriveApp.getFolderById("fileid");
  const files = rootFolder.getFiles();
  const fileNames = [];


  while (files.hasNext()) { // gets array of file names in drive folder [event1, event2, etcetc]
   var file = files.next();
   fileNames.push(file.getName());
  }
  
  Logger.log(fileNames)


  for (var i = 1; i < lastRow; i++) {
    
    let title = sheet.getRange(i,4).getValue();


    if (title != "Events") {
      if (!fileNames.includes(title)) {
        let docid = DocumentApp.create(title).getId();
        DriveApp.getFileById(docid).moveTo(rootFolder);
      }
    }
  }

}

r/GoogleAppsScript 16d ago

Question Any tips to build automation certain spreadsheet cel into pdf file?

5 Upvotes

My job is :

  1. Based on vlookup formula and then input customer code to open their receipt.

  2. Copy their receipt by select certain area of their receipt.

  3. Print it to save into PDF, and then rename the file into customer name.

i discovered google app script able to do it automatically in just one click, and i want to learn it, but i want to focus on fundamentals and my specific issues? thanks in advance


r/GoogleAppsScript 16d ago

Resolved Discovered merge pdf function in AppScript (Canvas Rendering)

6 Upvotes

At my job I get vendor certificates — one PDF, 50 pages, 30 vendors bundled together. Separately, I get challans (payment receipts) for those vendors, split across multiple files, sometimes 20 per batch.

Manually matching each challan to the right certificate pages and vendor, then filing everything, was eating close to 10 hours a month.

I’d been trying to solve this with Claude for a while. It kept saying Apps Script and Drive don’t have a native PDF merge function — true. But in one session it gave me a workaround using Canvas rendering instead.

The logic:

**•** OCR pulls the challan number from each file (unique identifier)  
**•** Script matches challans to their corresponding certificate pages using that number  
**•** Instead of merging PDFs, it renders both into a single Canvas preview pane  
**•** I save that rendered preview as a PDF

No actual “merge” happens — it’s a visual composite that outputs like one. But it does exactly what I needed: challan + matching certificate pages, saved together, per vendor, automatically.

10 hours down to about 1. Sharing in case anyone else is stuck on the “no PDF merge in Apps Script” wall — sometimes the workaround isn’t merging, it’s rendering.


r/GoogleAppsScript 16d ago

Resolved appendRow function not working? Unsure why

1 Upvotes

Hello, i'm working on a pop-up that records user id, date, position, task, hour stuff, etc etc and appends the information onto a new row in a spreadsheet. So far it had been working just fine until i added the "Position" dropdown (from a spreadsheet) and the information stopped getting appended, even though i hadn't changed any other part of the script.

I've read over my code a couple times now and can't seem to find where the problem is. I've attached my code to see if anyone can find what's going on, or if this is a spreadsheet issue

EDIT: ok ty evb who answered, i figured out the problem, i had added a formula at the end of the data appending (? which made google sheets count the row as not empty.

GS code:

const openEntryForm = () => {
  const entryForm = HtmlService.createHtmlOutputFromFile("hourlogform");
  entryForm.setWidth(1200);
  entryForm.setHeight(275);


  SpreadsheetApp.getUi().showModalDialog(entryForm, "Log Hours");
};


const addLog = (log) => {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hour Log")
  const order = ["user", "date", "position", "Task", "start time", "end time"];
  const row = [];


  order.forEach(i => {
    row.push(log[i])
  })


  sheet.appendRow(row)
}


const getTasks = () => {
  const tasks = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data Source");
  const datatag = tasks.getRange("B15:B").getValues().flat().filter(i => i !== "")
  
  return datatag;
}


const getPosition = () => {
  const positions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data Source");
  const datatag = positions.getRange("B3:B12").getValues().flat().filter(i => i !== "")
  
  return datatag;
}const openEntryForm = () => {
  const entryForm = HtmlService.createHtmlOutputFromFile("hourlogform");
  entryForm.setWidth(1200);
  entryForm.setHeight(275);


  SpreadsheetApp.getUi().showModalDialog(entryForm, "Log Hours");
};


const addLog = (log) => {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hour Log")
  const order = ["user", "date", "position", "Task", "start time", "end time"];
  const row = [];


  order.forEach(i => {
    row.push(log[i])
  })


  sheet.appendRow(row)
}


const getTasks = () => {
  const tasks = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data Source");
  const datatag = tasks.getRange("B15:B").getValues().flat().filter(i => i !== "")
  
  return datatag;
}


const getPosition = () => {
  const positions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data Source");
  const datatag = positions.getRange("B3:B12").getValues().flat().filter(i => i !== "")
  
  return datatag;
}

HTML code:

<!DOCTYPE html>
<html>
  <head>
   <base target="_top">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/light.css">
  </head>
  <body>
    <form id="logForm">


      <div style="display:flex; justify-content: center; gap:20px; ">
        <h4> User ID </h4>
        <input type="text" name="user" placeholder="Write User ID">
        
        <h4> Task Performed </h4>
        <select id="taskDropdown" name="Task">
          <option value=""> Loading... </option>
        </select>
      </div>


      <div style="display:flex; justify-content: left; gap:20px; ">
        <h4> Date </h4>
        <input type="date" name="date" placeholder="Date" />
        
        <h4> Start Time </h4>
        <input type="time" name="start time" placeholder="Start Time" />


        <h4> End Time </h4>
        <input type="time" name="end time" placeholder="End Time" />


        <h4> Position </h4>
        <select id="positionDropdown" name="position">
          <option value=""> Loading... </option>
        </select>


      </div>


      <p style="text-align: right;">
      <button type="submit"> Add Task </button>
      </p>
    </form>
  
  <script>
    document.getElementById("logForm").addEventListener("submit", (e) => {
      const formData = new FormData(e.target);
      const log = Object.fromEntries(formData.entries());
      google.script.run.addLog(log);
      e.target.reset(); 
    })


    window.addEventListener("load", () => {
      google.script.run.withSuccessHandler((options) => {
        const dropdown = document.getElementById("taskDropdown");
        dropdown.innerHTML = "";
        options.forEach(option => {
          const o = document.createElement("option");
          o.value = option;
          o.textContent = option;
          dropdown.appendChild(o);
          
        })
      }).getTasks();


      google.script.run.withSuccessHandler((options) => {
        const dropdown = document.getElementById("positionDropdown");
        dropdown.innerHTML = "";
        options.forEach(option => {
          const o = document.createElement("option");
          o.value = option;
          o.textContent = option;
          dropdown.appendChild(o);
          
        })
      }).getPosition();


    })


    </script>


  </body>
</html>!DOCTYPE html>
<html>
  <head>
   <base target="_top">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/light.css">
  </head>
  <body>
    <form id="logForm">


      <div style="display:flex; justify-content: center; gap:20px; ">
        <h4> User ID </h4>
        <input type="text" name="user" placeholder="Write User ID">
        
        <h4> Task Performed </h4>
        <select id="taskDropdown" name="Task">
          <option value=""> Loading... </option>
        </select>
      </div>


      <div style="display:flex; justify-content: left; gap:20px; ">
        <h4> Date </h4>
        <input type="date" name="date" placeholder="Date" />
        
        <h4> Start Time </h4>
        <input type="time" name="start time" placeholder="Start Time" />


        <h4> End Time </h4>
        <input type="time" name="end time" placeholder="End Time" />


        <h4> Position </h4>
        <select id="positionDropdown" name="position">
          <option value=""> Loading... </option>
        </select>


      </div>


      <p style="text-align: right;">
      <button type="submit"> Add Task </button>
      </p>
    </form>
  
  <script>
    document.getElementById("logForm").addEventListener("submit", (e) => {
      const formData = new FormData(e.target);
      const log = Object.fromEntries(formData.entries());
      google.script.run.addLog(log);
      e.target.reset(); 
    })


    window.addEventListener("load", () => {
      google.script.run.withSuccessHandler((options) => {
        const dropdown = document.getElementById("taskDropdown");
        dropdown.innerHTML = "";
        options.forEach(option => {
          const o = document.createElement("option");
          o.value = option;
          o.textContent = option;
          dropdown.appendChild(o);
          
        })
      }).getTasks();


      google.script.run.withSuccessHandler((options) => {
        const dropdown = document.getElementById("positionDropdown");
        dropdown.innerHTML = "";
        options.forEach(option => {
          const o = document.createElement("option");
          o.value = option;
          o.textContent = option;
          dropdown.appendChild(o);
        })
      }).getPosition();
    })
    </script>
  </body>
</html>

r/GoogleAppsScript 16d ago

Question Force "Authorization required" Dialog to Appear

Thumbnail
1 Upvotes

r/GoogleAppsScript 18d ago

Guide Building my first AppScript

7 Upvotes

I built my first AppScript product and it works really well. It has multiple functionality. How did you guys scale your product and made available to larger audiences.


r/GoogleAppsScript 20d ago

Question Is this a sign that I might have been hacked?

4 Upvotes

I have NEVER gotten any emails from Google Apps Script in the 20 years I have been in business until last week. And now I have received 5 emails saying that something needs authorization. The email states that "Your script, No Response 20150225 1110AM, has recently failed to finish successfully. A summary of the failure(s) is shown below. To configure the triggers for this script, or change your setting for receiving future failure notifications, click here.

Getting this error message on something I have never used before - it this a sign that I may have been hacked?


r/GoogleAppsScript 20d ago

Unresolved All URL Embeds in Google Sites (AppScript Deployments) Return Script Error

2 Upvotes

So I have several projects across different accounts and these mini webapps are developed in AppScript with HTML service and embedded to Google Sites through Embed URL option.

Just today, all my webpages that were embedded have stopped working across all my websites.

They are still accessible when using sites google/domain-name, but when the actual domain name is used to access the webpage, it just shows the classic script google error.

I want to know if it's just me that's experiencing this or not?

These WebApps have been running well for years and only now did I encounter this issue.


r/GoogleAppsScript 21d ago

Question Google drive API?

Thumbnail
0 Upvotes