Apps Script触发器手动正常但自动触发失败问题排查
问题
手动运行Google Apps Script重命名Drive文件夹文件完全正常(耗时3-5.5秒),但通过自动触发器每5分钟执行时每次失败(仅耗时1-1.5秒),报错:
TypeError: iA.indexOf is not a function at rename(Code:13:22)
脚本代码如下:
function rename(iA = ['20240922', '20240924', '20240930'], oA = ['NNN2024-09-22.mp4', 'NNN2024-09-24.mp4', 'NNN2024-09-30.mp4']) { const SourceFolder = DriveApp.getFolderById("*****************"); const files = SourceFolder.getFiles(); while (files.hasNext()) { const file = files.next(); const fileDateMatch = file.getName().match(/(\d{8})/); // Extract date from file name if (fileDateMatch) { const fileDate = fileDateMatch[1]; // Get the matched date string const idx = iA.indexOf(fileDate); if (idx !== -1) { file.setName(oA[idx]); Logger.log(`Renamed file: ${file.getName()} to ${oA[idx]}`); // Log renaming action } } } }
问题原因与解决方案
- 核心原因:Google Apps Script触发器执行时,会自动传入一个事件对象作为第一个参数,覆盖了你函数定义里的默认数组参数,导致
iA变为事件对象而非数组,自然没有indexOf方法。 - 修复方案1:将默认数组移至函数内部
直接在函数内定义数组,彻底避免参数被触发器覆盖的问题:function rename() { const iA = ['20240922', '20240924', '20240930']; const oA = ['NNN2024-09-22.mp4', 'NNN2024-09-24.mp4', 'NNN2024-09-30.mp4']; const SourceFolder = DriveApp.getFolderById("*****************"); const files = SourceFolder.getFiles(); while (files.hasNext()) { const file = files.next(); const fileDateMatch = file.getName().match(/(\d{8})/); if (fileDateMatch) { const fileDate = fileDateMatch[1]; const idx = iA.indexOf(fileDate); if (idx !== -1) { file.setName(oA[idx]); Logger.log(`Renamed file: ${file.getName()} to ${oA[idx]}`); } } } } - 修复方案2:添加参数校验与兜底
保留参数结构,但主动覆盖触发器传入的事件对象,确保参数为预期数组:function rename(iA, oA) { iA = iA || ['20240922', '20240924', '20240930']; oA = oA || ['NNN2024-09-22.mp4', 'NNN2024-09-24.mp4', 'NNN2024-09-30.mp4']; const SourceFolder = DriveApp.getFolderById("*****************"); const files = SourceFolder.getFiles(); while (files.hasNext()) { const file = files.next(); const fileDateMatch = file.getName().match(/(\d{8})/); if (fileDateMatch) { const fileDate = fileDateMatch[1]; const idx = iA.indexOf(fileDate); if (idx !== -1) { file.setName(oA[idx]); Logger.log(`Renamed file: ${file.getName()} to ${oA[idx]}`); } } } } - 补充说明:手动运行时无参数传入,会使用函数定义的默认数组;但触发器强制传入事件对象,直接覆盖了默认参数,这就是两种执行结果不同的根本原因。
内容的提问来源于stack exchange,提问作者Anton Marks
相关产品推荐
相关产品推荐

