Google Sheets计数脚本迁移至新表格后无法运行求助
问题
我曾使用一款计数脚本,可统计名为"Pipe"的工作表中多列单元格的修改次数,并将计数同步至"Brain"工作表。现将该脚本复制到新创建的Google Sheets表格中,仅更新了目标表格的URL,但脚本完全无法运行。此前该脚本运行正常,尝试过其他可用的计数脚本也无效,检查代码未发现问题。
新表格ID:1ZrqKeROY1yxsj3-wrCajmcU8fItbCD8pVJizxyHTfl8
脚本代码:
function allInOne01(e) { // some variables const sheetToWatch = 'Pipe'; const sheet = e.range.getSheet(); // test if edit is is a value, AND in correct Sheet AND in correct row if (!e.value || sheet.getName() !== sheetToWatch || e.range.rowStart <= (sheet.getFrozenRows() || 1)) { // if failed end processing return; } // an array of Column Sets const colSets = [[7,1,15],[8,2,16],[9,3,17],[10,5,19],[11,6,20]]; // columnCtart, countColumn#1,countColumn#2 // create an array of columnStart values var columns = colSets.map(function(e){return e[0];}); // find the columnStart in columns var result = columns.indexOf(e.range.columnStart); // Logger.log("DEBUG: result = "+result) if (result !== -1){ // if -1, then value not found, otherwise value = zero-based index const targetSs = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1ZrqKeROY1yxsj3-wrCajmcU8fItbCD8pVJizxyHTfl8/edit#gid=27102914") //id of spreadsheet const targetSheetName = 'Brain'; //fill in name of other sheet/tab const targetSheet = targetSs.getSheetByName(targetSheetName) //Logger.log("DEBUG: CountColumn#1: "+colSets[result][1]) //Logger.log("DEBUG: CountColumn#2: "+colSets[result][2]) const countColumn1 = colSets[result][1]; const countColumn2 = colSets[result][2]; // increment count1 const countCell1 = targetSheet.getRange(e.range.rowStart, countColumn1); countCell1.setValue((Number(countCell1.getValue()) || 0) + 1); // increment count2 const countCell2 = targetSheet.getRange(e.range.rowStart, countColumn2); countCell2.setValue((Number(countCell2.getValue()) || 0) + 1); // Logger.log('DEBUG: Complete'); } }
解决方案
1. 配置触发器
该脚本依赖onEdit触发器触发,新表格中需要手动配置:
- 打开脚本编辑器,点击左侧「触发器」图标
- 点击「添加触发器」,设置:
- 函数选择:
allInOne01 - 部署类型:「从电子表格」
- 事件源:「编辑时」
- 保存并完成权限授权
- 函数选择:
2. 修正目标表格URL格式
SpreadsheetApp.openByUrl不支持带#gid锚点的URL,需修改代码中的URL部分:
// 推荐用ID打开(更稳定) const targetSs = SpreadsheetApp.openById("1ZrqKeROY1yxsj3-wrCajmcU8fItbCD8pVJizxyHTfl8") // 或者修改URL去掉锚点 // const targetSs = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1ZrqKeROY1yxsj3-wrCajmcU8fItbCD8pVJizxyHTfl8/edit")
3. 完成权限授权
新表格首次运行脚本需要授权,手动执行一次allInOne01函数(手动执行时因e参数为空会直接返回,但能触发权限请求),按提示完成授权流程。
4. 排查冻结行判断逻辑
若"Pipe"工作表无冻结行,sheet.getFrozenRows()返回0,此时e.range.rowStart <= 1会阻止第一行的修改计数。如需统计第一行,可调整判断条件:
if (!e.value || sheet.getName() !== sheetToWatch || e.range.rowStart < 1)
5. 启用日志调试
取消代码中Logger.log的注释,修改后操作触发脚本,通过脚本编辑器「查看」→「日志」查看执行细节,定位具体错误。
内容的提问来源于stack exchange,提问作者Eric M
相关产品推荐
相关产品推荐

