Google Apps Script触发配置需求:新增行后30秒触发及邮件发送脚本触发设置
解决方案:配置Google Apps Script触发机制满足你的邮件脚本需求
嘿,针对你提出的三个触发需求,结合现有的sendEmail()脚本,我整理了具体的实现方案,一步步来:
1. 仅当目标工作表新增行时触发脚本(带30秒延迟)
因为你的目标表是通过query函数同步数据的,直接用onChange触发可能无法识别公式生成的新增行(这类变更不会触发“添加行”的事件),所以更可靠的方式是时间驱动触发+对比历史行数:
步骤1:新增检查行数的辅助函数
在你的脚本编辑器里添加这个函数,用来对比当前行数和上次存储的行数,判断是否有新行:
function checkNewRows() { // 替换成你的目标工作表名称 const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("目标表名称"); const scriptProps = PropertiesService.getScriptProperties(); // 读取上次存储的行数,初始值设为1(表头行) const lastRowCount = parseInt(scriptProps.getProperty('LAST_ROW_COUNT')) || 1; const currentRowCount = targetSheet.getLastRow(); // 如果当前行数大于上次的,说明有新行 if (currentRowCount > lastRowCount) { // 延迟30秒执行邮件脚本 Utilities.sleep(30000); sendEmail(); // 更新存储的行数,避免重复触发 scriptProps.setProperty('LAST_ROW_COUNT', currentRowCount.toString()); } }
步骤2:设置时间驱动触发器
- 在脚本编辑器左侧点击闹钟图标(触发器)
- 点击添加触发器,配置如下:
- 选择函数:
checkNewRows - 事件源:
时间驱动 - 类型:
分钟计时器 - 间隔:
每1分钟(可以根据你的数据同步频率调整,比如5分钟一次)
- 选择函数:
2. 在数据来源工作表添加按钮触发
如果你想手动触发脚本,可以在来源表加一个可点击的按钮:
步骤1:创建按钮
- 打开数据来源电子表格,点击顶部菜单插入 > 绘图
- 选择一个矩形形状,调整样式后,添加文字(比如“发送新案件邮件”),保存并关闭绘图编辑器
- 把绘图拖动到合适的位置
步骤2:绑定脚本
- 右键点击刚才创建的绘图,选择分配脚本
- 输入
triggerEmailWithDelay(如果需要延迟30秒)或者直接sendEmail(即时触发)
可选:带延迟的按钮触发函数
如果需要点击按钮后延迟30秒发送,添加这个函数:
function triggerEmailWithDelay() { Utilities.sleep(30000); sendEmail(); }
3. 关于延迟30秒触发的补充
上面两个方案里都用到了Utilities.sleep(30000),这里有个小注意点:
- 时间驱动触发时,sleep会在后台静默执行,不会有任何提示
- 按钮触发时,屏幕会显示“正在执行脚本”的弹窗,直到延迟结束,这是正常现象
对原sendEmail脚本的小优化建议
为了避免发送空邮件(当没有未标记的行时),可以在循环结束后加个判断,同时优化循环写法:
function sendEmail() { //setup function var ActiveSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var StartRow = 2; var RowRange = ActiveSheet.getLastRow() - StartRow + 1; var WholeRange = ActiveSheet.getRange(StartRow,1,RowRange,16); var AllValues = WholeRange.getValues(); var message = ""; //iterate loop // 用for循环替代for...in,避免遍历到数组原型属性 for (let i = 0; i < AllValues.length; i++) { var CurrentRow = AllValues[i]; var EmailSent = CurrentRow[14]; //if row has been sent, then continue to next iteration if (EmailSent == "sent") continue; //set HTML template for information message += "<p><b>Bank: </b>" + CurrentRow[0] + "</p>" + "<p><b>Branch: </b>" + CurrentRow[1] + "</p>" + "<p><b>Region: </b>" + CurrentRow[2] + "</p>" + "<p><b>Lan Number: </b>" + CurrentRow[3] + "</p>" + "<p><b>Customer Name: </b>" + CurrentRow[4] + "</p>" + "<p><b>Loan Type: </b>" + CurrentRow[5] + "</p>" + "<p><b>Case Worker: </b>" + CurrentRow[11] + "</p>" + "<p><b>Documents Recieved: </b>" + CurrentRow[6] + "</p>" + "<p><b>Initiated Date: </b>" + CurrentRow[7] + "</p>" + "<p><b>Site Visit Status: </b>" + CurrentRow[8] + "</p>" + "<p><b>Site Visit Date: </b>" + CurrentRow[9] + "</p>" + "<p><b>Site Visit Done by: </b>" + CurrentRow[10] + "</p><br><br>"; //set the row to look at var setRow = parseInt(i) + StartRow; //mark row as "sent" ActiveSheet.getRange(setRow, 15).setValue("sent"); } // 新增:如果没有新内容,不发送邮件 if (message === "") { return; } //define who to send grants to var SendTo = "$$$$$@gmail.com" + "," + "&&&&&&@gmail.com" + "," + "@@@@@@@gmail.com"+ "," + "######@gmail.com "; //set subject line var Subject = "New case initiated to Veena"; //send the actual email MailApp.sendEmail({ to: SendTo, cc: "#######@gmail.com", subject: Subject, htmlBody: message, }); }
内容的提问来源于stack exchange,提问作者Rama Krishna
相关产品推荐
相关产品推荐

