我在这里结束了我的智慧。我有三个脚本工作得很漂亮,然后一夜之间他们都因为可怕的“服务错误”而失败了。
错误始终引用getLastRow
作为违规行。我已经尝试添加和删除工作表底部的行,删除其中包含数据的一些行,解冻标题和列等等,没有任何运气。我也尝试恢复到上周版本的剧本,早在失败之前(首先是星期一晚上),无济于事。
我做了很多研究,我经常注意到修复这些服务错误的事情是完全随机的。有人说这个错误是由Google端的记忆引起的。如果是这样,我该怎么做才能解决这个问题?
一个巨大的项目基本上是崩溃和燃烧,因为这些脚本失败了...任何帮助都会很棒。感谢。
供参考,我的一个脚本(首先失败的脚本)。
function timeStamp2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[4];
var numRows = sheet.getLastRow()-1; // Number of rows to process
Logger.log(numRows)
var startRow = 2; // First row of data to process
// Fetch the range of cells
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
// Fetch values for each row in the Range.
var data = dataRange.getValues();
//Logger.log(data)
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var schedulingStatus = row[4];
var timeStamp = row[3];
var scheduled = "Scheduled";
if(timeStamp === '') {
if(schedulingStatus == scheduled ) {
sheet.getRange(startRow + i, 3).setValue(new Date());
}
}
}
}
答案 0 :(得分:2)
这是否构成“答案”我无法判断,但请放心,您并不是唯一注意到某些内在GAS功能的零星行为 - 特别是一些常用于电子表格以附加新行或找到最后一行/数据列 - 由于执行时间极长而困扰我自己的代码和其他代码,每个实例通常高达20秒!
我坚持getLastRow()
中必须存在隐藏的时间缺陷,如下所示。现在问题通常会在我的工作流程中导致超时并导致频繁出现故障和服务错误:电子表格消息。
例如,如果您每分钟运行以下代码函数(通过定时触发器)......
function getLastRow_TEST() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("getLastRow_TEST");
var timeBegin = Date.now();
var nextRow = sheet.getLastRow() + 1;
var timeEnd = Date.now();
var range = sheet.getRange("A" + nextRow + ":B" + nextRow);
var timeElapsed = (timeEnd - timeBegin) / 1000;
range.setValues([[nextRow - 1, timeElapsed]]);
}
...在您的测试电子表格中,包含名为“ getLastRow_TEST ”的工作表,您很快就会注意到聚集延迟(> 1秒),如结果数据所示(在10收集) :2016年6月6日星期一上午55点),但没有明显的发生模式:
TEST # SECONDS
1 0.041
2 10.242 *
3 10.256 *
4 5.194 *
5 0.055
6 0.178
注意:此测试是使用其他原始(空)电子表格执行的,没有其他代码在运行,没有定时触发器,也没有活动脚本锁定。
我正在尝试将此问题作为Google问题跟踪器的错误报告提交,但我觉得有必要在此分享我的经验(我在其他地方发布了有关此故障的信息)。
答案 1 :(得分:0)
您是否正确计算阵列位置?
ss.getSheets()[4]
意味着它是第五张。我还注意到,虽然您将timeStamp初始化为行的第四列中的值:
var timeStamp = row[3]
稍后你:
sheet.getRange(startRow + i, 3).setValue(new Date())
在该行的第三列。即row [3]是sheet.getRange(startRow + i,3)右侧的一个单元格。
答案 2 :(得分:0)
我写的脚本遇到了类似的问题。
它给出了服务错误:Spreadsheets表示问题在于包含getLastRow
的行。
我的修复程序最终确保底部至少有一行没有任何数据。从那以后,Haven就遇到了问题。
答案 3 :(得分:0)
我最近有同样的问题。
我要修复的尝试是:
getLastRow
替换为getMaxRows
-获取最后一个
一张纸sheet.getDataRange().getLastRow();
→假设我的数据范围开始
在第1行,结果应该相同。