Google Sheets中同时运行两个脚本时邮件通知脚本失效求助
问题:Google Sheet双脚本共存时邮件通知失效
我在Google Sheet中运行两个脚本:Format.gs负责将最新单元格的格式复制到新单元格,Code.gs负责发送新条目邮件通知。两个脚本单独运行均正常,但同时添加到同一张Google Sheet后,邮件通知脚本停止工作。我是脚本新手,附上两个脚本代码,恳请帮助解决问题。
原脚本代码
Format.gs
/** * @OnlyCurrentDoc */ const createTrigger = () => { ScriptApp.getProjectTriggers().forEach((trigger) => { ScriptApp.deleteTrigger(trigger); }); ScriptApp.newTrigger('formRowOnFormSubmit').forSpreadsheet(SpreadsheetApp.getActive()).onFormSubmit().create(); }; const formRowOnFormSubmit = (e) => { if (!e) { throw new Error('Please do not run this function manually!'); } const { range } = e; const row = range.getRowIndex(); if (row > 2) { const sheet = range.getSheet(); // Select the previous row range const sourceRange = sheet.getRange(`${row - 1}:${row - 1}`); // Get the recently added row const targetRange = sheet.getRange(`${row}:${row}`); // Copy the format only from the previous row to the current row sourceRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); } };
Code.gs
function processEdit(e) { MailApp.sendEmail({ to: "mail@gmail.com", subject: "New entry!", body: "Yay! New entry in the Google Sheet." }); }
问题原因
你的createTrigger函数会删除所有现有触发器,然后只创建formRowOnFormSubmit的表单提交触发器。而邮件通知函数processEdit依赖的触发器(无论是编辑触发器还是表单提交触发器)都会被这个函数删除,导致邮件脚本无法被触发执行。
解决方法
修改createTrigger函数,仅清理自身相关的旧触发器,保留其他触发器;同时为processEdit创建对应的表单提交触发器(因为你的场景是新条目提交,用表单提交触发器比编辑触发器更精准,避免编辑旧行误发邮件)。
修改后的代码
Format.gs
/** * @OnlyCurrentDoc */ const createTrigger = () => { // 仅删除formRowOnFormSubmit的旧触发器,保留其他触发器 ScriptApp.getProjectTriggers().forEach((trigger) => { if (trigger.getHandlerFunction() === 'formRowOnFormSubmit') { ScriptApp.deleteTrigger(trigger); } }); // 创建格式处理的表单提交触发器 ScriptApp.newTrigger('formRowOnFormSubmit') .forSpreadsheet(SpreadsheetApp.getActive()) .onFormSubmit() .create(); // 检查是否已存在processEdit的表单提交触发器,不存在则创建 const hasProcessEditTrigger = ScriptApp.getProjectTriggers().some(trigger => trigger.getHandlerFunction() === 'processEdit' && trigger.getEventType() === ScriptApp.EventType.ON_FORM_SUBMIT ); if (!hasProcessEditTrigger) { ScriptApp.newTrigger('processEdit') .forSpreadsheet(SpreadsheetApp.getActive()) .onFormSubmit() .create(); } }; const formRowOnFormSubmit = (e) => { if (!e) { throw new Error('请不要手动运行此函数!'); } const { range } = e; const row = range.getRowIndex(); if (row > 2) { const sheet = range.getSheet(); // 选择上一行范围 const sourceRange = sheet.getRange(`${row - 1}:${row - 1}`); // 获取新增的行 const targetRange = sheet.getRange(`${row}:${row}`); // 仅复制格式到当前行 sourceRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); } };
Code.gs(可按需修改文案)
function processEdit(e) { MailApp.sendEmail({ to: "mail@gmail.com", subject: "新条目提醒!", body: "太好了!Google Sheet中有新的条目添加了。" }); }
操作步骤
- 打开Google Sheet的脚本编辑器,将原Format.gs的代码替换为上述修改后的版本
- 在脚本编辑器的运行菜单中选择
createTrigger函数,执行一次(首次运行需要授权) - 提交一次表单测试,此时应该会自动复制上一行格式,同时收到邮件通知
内容的提问来源于stack exchange,提问作者user19795423
相关产品推荐
相关产品推荐

