如何在Google Apps Script中合并多个onEdit函数?
问题说明
我通过Google表单填充Google表格内容,同时手动在同一表格的多列中输入数据。我有两个不同的onEdit相关函数,单独运行时均正常工作,但在同一表格中尝试合并后,仅能生效其中一个。两个功能如下:
- 基于其他单元格的值自动生成时间戳
- 将表格字体调大(Google表单填充的内容字体总是比期望的小)
以下是我的代码:
时间戳函数
function onEdit(e) { var row = e.range.getRow(); var col = e.range.getColumn(); if(col === 31) e.source.getActiveSheet().getRange(row,30).setValue(new Date()); if(col === 34) e.source.getActiveSheet().getRange(row,33).setValue(new Date()); }
字体设置函数
function onEdit1() { var ss=SpreadsheetApp.getActiveSpreadsheet(); var sheets=ss.getSheets(); for (var i in sheets) { sheets[i].getRange(1,1,sheets[i].getMaxRows(),sheets[i].getMaxColumns()).setBackground('#ffffff').setFontSize(14).setFontFamily("Arial").setFontWeight("bold"); } }
解决方案
核心问题
Google Apps Script的简单编辑触发器只会自动触发名为onEdit的函数,onEdit1这类自定义命名的函数不会在编辑表格时自动运行,这就是合并后只有一个功能生效的原因。
合并后的优化代码
把两个功能整合到同一个onEdit函数中,同时优化字体设置逻辑(避免每次编辑都遍历全表所有单元格,提升性能):
function onEdit(e) { var range = e.range; var sheet = range.getSheet(); var row = range.getRow(); var col = range.getColumn(); // 1. 时间戳生成逻辑 if(col === 31) { sheet.getRange(row, 30).setValue(new Date()); } if(col === 34) { sheet.getRange(row, 33).setValue(new Date()); } // 2. 字体格式设置逻辑:仅处理当前编辑的行,而非全表 var editedRowRange = sheet.getRange(row, 1, 1, sheet.getLastColumn()); editedRowRange.setBackground('#ffffff') .setFontSize(14) .setFontFamily("Arial") .setFontWeight("bold"); }
补充:处理表单提交的字体问题
上面的代码只在手动编辑表格时生效,Google表单提交的内容不会触发onEdit简单触发器。如果要让表单提交的内容也自动应用字体格式,需要添加可安装的表单提交触发器:
- 打开表格的脚本编辑器(工具 > 脚本编辑器)
- 添加以下函数:
function onFormSubmit(e) { var range = e.range; // 对表单提交的行应用格式 range.setBackground('#ffffff') .setFontSize(14) .setFontFamily("Arial") .setFontWeight("bold"); }
- 设置触发器:点击编辑器左侧的「触发器」图标 > 添加触发器 > 选择
onFormSubmit函数,事件源选「电子表格」,事件类型选「表单提交」,保存即可。
内容的提问来源于stack exchange,提问作者J.S. McGinnis
相关产品推荐
相关产品推荐

