Javascript 谷歌应用程序电子表格脚本随机停止?

Javascript 谷歌应用程序电子表格脚本随机停止?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我已经编写了一个简单的谷歌应用程序电子表格脚本,它在某些行中获取详细信息,并将其转换为单个列表;一切都很简单。问题是脚本一直在随机点停止,循环永远不会结束-没有错误消息,脚本编辑器顶部的消息仍然指示它正在运行,但它已明显停止 我最初认为它可能被某种方式限制了,但随机停止点(有时在源工作表第6x行,有时在第7x行,有时在数百行)和缺少错误消息表明情况并非如此 有人能帮我弄清楚为什么会这样吗?是因为我正在脚本编辑器窗口中运行它吗?是否有其他原因(可能是网络问题)导致应用程序脚本停止运行,如果是,是否

我已经编写了一个简单的谷歌应用程序电子表格脚本,它在某些行中获取详细信息,并将其转换为单个列表;一切都很简单。问题是脚本一直在随机点停止,循环永远不会结束-没有错误消息,脚本编辑器顶部的消息仍然指示它正在运行,但它已明显停止

我最初认为它可能被某种方式限制了,但随机停止点(有时在源工作表第6x行,有时在第7x行,有时在数百行)和缺少错误消息表明情况并非如此

有人能帮我弄清楚为什么会这样吗?是因为我正在脚本编辑器窗口中运行它吗?是否有其他原因(可能是网络问题)导致应用程序脚本停止运行,如果是,是否可以在后台或类似环境中运行以防止出现这种情况

谢谢

函数convertTrimsToList(){
var ss=SpreadsheetApp.openById(“[redact]”);
var sheet=ss.getSheets()[0];
var News=电子表格应用程序。创建(“MMT列表”);
var newsheet=news.getSheets()[0]

x=1; z=1; i=1; q=1; while(sheet.getRange(x,1).getValue()!=“”) { 表.getRange(1,6).setValue(“处理行”+x); y=5; while(sheet.getRange(x,y).getValue()!=“”) { 表.getRange(1,7).setValue(“处理行”+y); 如果(x!=1) { 如果(y==5&&sheet.getRange(x,1).getValue()!=sheet.getRange((x-1),1).getValue()) { 我++ } } newsheet.getRange(z,1).setValue(i); newsheet.getRange(z,2).setValue(q); newsheet.getRange(z,3).setValue(sheet.getRange(x,y).getValue()); z++ y++ } 如果(x!=1) { if(sheet.getRange(x,3).getValue()!=sheet.getRange((x-1),3).getValue()) { q++ } } 其他的 { q++ } x++ }
}

您的代码效率很低。每次打电话给服务都很昂贵。这可能就是代码突然停止的原因。一种更有效的方法是将所有数据读入2D数组,然后在两个嵌套循环后一次性回写到电子表格中

事实证明,这与这里发生的问题是一样的:-我不确定为什么没有收到错误消息,但似乎是同一个问题,所以我重构了代码以纠正它

function convertTrimsToList(){
  var ss = SpreadsheetApp.openById("[REDACTED]");
  var sheet = ss.getSheets()[0];
  var newss = SpreadsheetApp.create("MMT List");
  var newsheet = newss.getSheets()[0];

x = 1; z = 1; i = 1; q = 1; while (sheet.getRange(x,1).getValue() != "") { sheet.getRange(1,6).setValue("Processing row " + x); y = 5; while (sheet.getRange(x,y).getValue() != "") { sheet.getRange(1,7).setValue("Processing row " + y); if (x != 1) { if (y == 5 && sheet.getRange(x,1).getValue() != sheet.getRange((x-1),1).getValue()) { i++ } } newsheet.getRange(z,1).setValue(i); newsheet.getRange(z,2).setValue(q); newsheet.getRange(z,3).setValue(sheet.getRange(x,y).getValue()); z++ y++ } if (x != 1) { if (sheet.getRange(x,3).getValue() != sheet.getRange((x-1),3).getValue()) { q++ } } else { q++ } x++ } }