【问题标题】:Google App Script Service error: SpreadsheetsGoogle 应用脚本服务错误:电子表格
【发布时间】:2017-05-16 21:11:55
【问题描述】:

没有设置为使用适当的 SQL 数据库或任何东西,所以使用谷歌表格。 我一直在尝试避免 importrange,因为我有大量数据不断更新,并且每天都会向表单响应添加更多行。 Importrange 经常因“importrange internal server error”而失败

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

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 行(代码的最后一行)。

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

importrange 效果不佳,我有一些 Google 表单,我需要结合源响应来操作数据以输出可呈现的电子表格。

谢谢

【问题讨论】:

  • 我认为问题是您超出了每个 spreadsheet 允许的单元格数量限制
  • 您好,我已经数过了,在这种情况下,它远低于 200 万个细胞的限制。这就是为什么我试图将源数据复制到其他工作表以进一步操作,否则在尝试将更多信息全部添加到一张工作表时,我会超出原始表单响应的限制..
  • 200,000 而不是 200 万!
  • 标签应该是关于核心问题的。在这种情况下,来自 Google 表单或任何其他来源的合并数据看起来没有任何区别。
  • @Jack Brown 线程和限制已经过时了,the current limit is 2 Million

标签: google-apps-script google-sheets


【解决方案1】:

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

当我将 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 列 x 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();
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多