Google Sheets中OnEdit触发器无法触发PDF生成脚本问题
自动生成发票PDF的触发器问题解决
问题背景
要自动生成发票PDF,主工作表包含多个无需打印的标签页,因此创建了用IMPORTRANGE导入发票详情的「PDF Print」工作表,通过主工作表脚本将当前发票号写入该工作表的A64单元格。手动运行脚本时功能正常,但onEdit触发器无法触发执行,怀疑onEdit仅响应手动修改单元格的操作。
问题原因
Google Sheets的简单onEdit触发器有两个关键限制:
- 仅响应用户手动直接编辑单元格的操作,脚本修改单元格、
IMPORTRANGE公式更新、表单提交等操作都不会触发它。 - 运行时权限受限,无法调用需要授权的服务(比如
DriveApp、UrlFetchApp),而savePDFs函数恰好用到了这些服务,即便触发也会执行失败。
解决方案
1. 替换为可安装的onChange触发器
可安装触发器能响应更多类型的更改(包括脚本修改、公式更新),且拥有完整的授权权限。
2. 优化代码逻辑
- 限定仅监控「PDF Print」工作表的A64单元格变更,避免无效触发。
- 修改
savePDFs函数,只打印「PDF Print」工作表,无需遍历所有标签页(匹配需求场景)。
修改后的完整代码:
// 可安装onChange触发器的处理函数 function onChangeTrigger(e) { // 仅处理单元格编辑类的变更(排除格式调整、排序等非内容变更) if (e.changeType !== 'EDIT') return; const range = e.range; const sheet = range.getSheet(); // 仅监控「PDF Print」工作表的A64单元格 if (sheet.getName() === 'PDF Print' && range.getA1Notation() === 'A64') { // 传入「PDF Print」工作表的ID,只打印该表 savePDFs(undefined, sheet.getSheetId()); } } function savePDFs(optSSId, optSheetId) { const ss = optSSId ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet(); const url = ss.getUrl().replace(/edit$/, ''); const parents = DriveApp.getFileById(ss.getId()).getParents(); // 获取或创建「Invoices PDF」文件夹 let folders = DriveApp.getFoldersByName('Invoices PDF'); const folder = folders.hasNext() ? folders.next() : parents.next(); // 仅处理指定ID的工作表(即「PDF Print」) const sheet = ss.getSheetById(optSheetId); if (!sheet) return; const url_ext = 'export?exportFormat=pdf&format=pdf' + '&gid=' + sheet.getSheetId() + '&size=A4' + '&portrait=true' + '&fitp=true' + '&sheetnames=false&printtitle=false&pagenumbers=false' + '&gridlines=false' + '&fzr=false'; const options = { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() } }; const response = UrlFetchApp.fetch(url + url_ext, options); const valor = sheet.getRange('C1').getValue(); const blob = response.getBlob().setName(valor + '.pdf'); folder.createFile(blob); ClearPrintTrig(); } function ClearPrintTrig() { const spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('PDF Print!A64').clear({ contentsOnly: true, skipFilteredRows: true }); }
3. 创建可安装触发器
- 打开Google Sheets的脚本编辑器(工具→脚本编辑器)。
- 点击左侧面板的「触发器」图标(时钟形状)。
- 点击「添加触发器」按钮,配置如下:
- 选择要运行的函数:
onChangeTrigger - 选择部署来源:「从电子表格」
- 选择事件类型:「更改」
- 选择要运行的函数:
- 保存触发器,按提示完成授权流程。
注意事项
- 授权时需使用拥有电子表格和Drive访问权限的账号。
- 如果「Invoices PDF」文件夹不存在,脚本会自动在当前电子表格所在的父文件夹创建它。
内容的提问来源于stack exchange,提问作者Ben C
相关产品推荐
相关产品推荐

