You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中有新的条目添加了。"
  });
} 

操作步骤

  1. 打开Google Sheet的脚本编辑器,将原Format.gs的代码替换为上述修改后的版本
  2. 在脚本编辑器的运行菜单中选择createTrigger函数,执行一次(首次运行需要授权)
  3. 提交一次表单测试,此时应该会自动复制上一行格式,同时收到邮件通知

内容的提问来源于stack exchange,提问作者user19795423

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:36:21