Google App脚本服务错误:电子表格

时间:2017-05-16 21:11:55

标签: google-apps-script google-sheets

我们没有设置使用正确的SQL数据库或其他任何东西,所以使用谷歌工作表。 我一直在努力避免导入范围,因为我不断更新大量数据,并且每天都会在表单响应中添加更多行。随着" importrange内部服务器错误"

,Importrange一直失败

我发现这个奇妙的代码可以从一个源电子表格复制到另一个电子表格(作为静态文本),因此我可以进一步操作数据:

function CopyTaskSource() {
 var sss = SpreadsheetApp.openById('1OPnw_7vTCFkChy8VUKhAG5QRhcpKnDbmod0ZxjG----'); //replace with source ID
 var ss = sss.getSheetByName('TASK Status'); //replace with source Sheet tab name
  var range = ss.getRange('E:L'); //assign the range you want to copy
 var data = range.getValues();

 var tss = SpreadsheetApp.openById('1T3tqsHvKxuulYxDnaR3uf-wjVdXwLHBcUgI7tgN----'); //replace with destination ID
 var ts = tss.getSheetByName('TaskSource'); //replace with destination Sheet tab name
 ts.getRange(1, 1, data.length, data[0].length).setValues(data); //you will need to define the size of the copied data see getRange()

}

现在它复制了大约15,000行数据,我预计最终会有50,000行数据(其他一些表格最多可达27列)。

我开始收到此服务错误:电子表格第9行(代码的最后一行)。

imageOfServiceError

有人可以告诉我一个解决方法,将批量数据传输到多个Google电子表格文件吗?

importrange运行不正常,我需要一些Google表单来组合源响应来操作数据以输出可显示的电子表格。

谢谢

1 个答案:

答案 0 :(得分:0)

所以我目前正在处理一个在出现问题时发送电子邮件的脚本,然后它会添加一个值数组,其中包含三个值[type,ID,status]到以[[values1]结尾的现有数组[values2],等等]。

当我将getRange的第三个参数保留为array.length时,我遇到了同样的错误。我昨天通过将array.length减去1得到了它,我将在下面显示。也许你可以在第9行尝试这个,看看是否能修复它?

重要的是要提到今天在运行完全相同的脚本后,它给了我一个错误,说明范围大小不正确(由于相同的减法似乎修复了服务错误)

我认为它可能会在谷歌方面被打破,但这不是我能确认的。

这:

ts.getRange(1, 1, data.length, data[0].length).setValues(data);

成为这个:

ts.getRange(1, 1, data.length - 1, data[0].length).setValues(data);

希望能为你解决这个问题,我真的很难过为什么它决定有一天工作而不是另一天...

我还添加了一个waitLock,以确保在尝试写入之前等待其他进程完成,但是实现我写的数据要小得多,一次只有3列乘6-10行。这是代码,虽然这是将数据插入工作表的顶部,而不是底部。 (来自Henrique G. Abreu,Original Post

function insertRow(sheetI, rowData, optIndex) {
  var lock = LockService.getScriptLock();
  lock.waitLock(30000);
  try { 
    var index = optIndex || 1;
    sheetI.insertRowsBefore(index,rowData.length).getRange(index, 1, rowData.length, 3).setValues(rowData)
    SpreadsheetApp.flush();
  } finally {
    lock.releaseLock();
  }
}