恢复谷歌表格旧版本后脚本运行极慢且异常报错求助
表格回滚后脚本运行极慢且报错的解决求助
问题详情
此前表格出现问题,我回滚到了旧版本,但恢复后出现以下异常:
- 脚本运行速度极慢,频繁因超时终止
- 出现从未见过的错误,疑似脚本无法正常定位表格
- 即便简单脚本,启动后第一行执行耗时长达2分钟
错误截图:
脚本耗时截图:
涉及脚本
function atualizarDisparos() { Logger.log("step1") var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DB'); Logger.log("step2") var startRow = 27; // 记得去掉表头 var quantidadeDeViveiros = 16; var lastRow = startRow + quantidadeDeViveiros; // 计算最后一行 Logger.log("step4") var startColumn = 2; // 记得去掉边框列 var lastColumn = ss.getLastColumn(); // 获取最后一列 var numColumns = lastColumn-startColumn+1; // 计算列数 var dataRange = ss.getRange(startRow, startColumn, quantidadeDeViveiros, numColumns) var data = dataRange.getValues(); var povoamento =""; var bioensaio =""; var despesca =""; var povoadoHoje =""; var atualizar = 0; var biomassaDespesca = 2000; var tamanhoDespesca = 18; var tempoBioensaio = 3; var diasParaVenda = 15; Logger.log("step4") for (var linhaAtual = 0; linhaAtual <= quantidadeDeViveiros-1; linhaAtual++) { var row = data[linhaAtual]; Logger.log("step5") if (row[7] == 0 || row[35] < diasParaVenda) { //==== 放养 var povoamento = povoamento + "V" + row[0] + " (" + row[12] + "kg de " + row[14] + "g) || " var atualizar = 1; } if (row[7] != 0 && row[9] == "" && row[11] <= 3) { //=== 生物试验 var dataPovoamento = new Date(row[5]); var dataBioensaio = dataPovoamento.setDate(dataPovoamento.getDate()+tempoBioensaio-1); var dataBioensaio = new Date(dataBioensaio); var dataHoje = new Date(); Logger.log(dataBioensaio) Logger.log(dataHoje) if (dataHoje >= dataBioensaio) { var dataBioensaio = Utilities.formatDate(dataBioensaio, Session.getScriptTimeZone(), 'dd/MM/yy'); var bioensaio = bioensaio + "V" + row[0] + " (取出生物试验样本: " + dataBioensaio + ") || " } var atualizar = 1; } if (row[7] != 0 && row[8] == 0) { //=== 今日放养 var dataPovoamento = new Date(row[5]); var dataPovoamento = new Date(dataPovoamento); var dataPovoamento = Utilities.formatDate(dataPovoamento, Session.getScriptTimeZone(), 'dd/MM/yy'); var povoadoHoje = povoadoHoje + "V" + row[0] + " (放养日期: " + dataPovoamento + ") || " var atualizar = 1; } if (row[14] >= 8 && row[35] < diasParaVenda) { //=== 捕捞 var despesca = despesca + "V" + row[0] + " (" + row[12] + "kg de " + row[14] + "g) || " var atualizar = 1 } } if(atualizar == 1) { var ssPC = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PC'); ssPC.getRange('k107').setValue(povoamento); ssPC.getRange('k108').setValue(bioensaio); ssPC.getRange('k109').setValue(despesca); ssPC.getRange('k123').setValue(povoadoHoje); } }
解决建议
1. 排查表格本身问题
- 回滚后的表格可能存在隐藏损坏或冗余数据,新建空白表格,复制原表格内容(不含脚本)到新表格,重新绑定脚本测试。
- 检查表格内是否有大量公式、条件格式或数据验证规则,暂时禁用后测试速度变化。
2. 优化脚本减少服务调用
Google Apps Script中,表格交互(如getRange、setValue)是核心耗时点,需尽量减少调用次数:
- 将多次
setValue改为批量写入:
// 替换原有的四次setValue调用 if(atualizar == 1) { var ssPC = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PC'); // 批量写入连续单元格 ssPC.getRange('K107:K109').setValues([[povoamento], [bioensaio], [despesca]]); // 单独写入不连续的K123 ssPC.getRange('K123').setValue(povoadoHoje); }
- 移除循环内的
Logger.log,大量日志输出会拖慢执行速度,仅保留关键节点日志用于调试。
3. 检查脚本绑定与权限
回滚后脚本绑定关系可能异常,尝试重新授权脚本,或复制脚本到新的脚本项目后重新绑定表格。
4. 单独测试表格访问耗时
运行以下脚本测试表格定位的耗时,确认是否是表格访问本身的问题:
function testSheetAccess() { const start = new Date(); const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DB'); const end = new Date(); Logger.log(`获取表格耗时:${end - start}毫秒`); }
如果这一步耗时超过10秒,说明表格存在访问异常,可尝试切换网络环境,或联系Google官方支持排查。
内容的提问来源于stack exchange,提问作者Emanuel Maia
相关产品推荐
相关产品推荐

