【问题标题】:Google Sheet script Error : "Service timed out: Spreadsheets". How to optimize the Google Apps ScriptGoogle Sheet 脚本错误:“服务超时:电子表格”。如何优化 Google Apps 脚本
【发布时间】:2021-05-14 14:09:27
【问题描述】:

我在运行 Google Sheet 脚本时总是收到以下错误:

服务超时:电子表格(第 10 行,文件“代码”)

脚本应将整个工作表从一个工作表复制并粘贴到另一个工作表(仅限值)。 问题是源表非常大,这就是我猜我得到错误的原因。源表以编程方式填充,但通常约为 8-10k 行

当我在较小的数据集上使用相同的脚本时,它可以完美运行。

很遗憾,我不是开发人员,只是营销人员,所以谁能帮我优化脚本以使其在 5 分钟限制内运行得更快?

这是脚本

function cloneGoogleSheet(ssA, ssB) {
  var sss = SpreadsheetApp.openById('sheet_id');
  var ss = sss.getSheetByName('Sheet1');
  var SRange = ss.getDataRange();
  var A1Range = SRange.getA1Notation();
  var SData = SRange.getValues();
  var tss = SpreadsheetApp.openById('sheet_id');
  var ts = tss.getSheetByName('Script'); 
  ts.clear({contentsOnly: true});
  ts.getRange(A1Range).setValues(SData);
}; 

谢谢!

杰克

【问题讨论】:

  • 数据范围有多大??这个函数是另一个函数的一部分吗?您知道可以复制工作表本身而不是值吗? .copyTo(spreadsheet)
  • 嗨,詹姆斯,感谢您的评论数据范围约为 10k 行和 10 列。说总共大约 100k 个单元 该函数是一个独立的脚本,没有任何其他函数。问题是我需要保留与其他工作表中的公式相同的工作表。并且该功能必须每天以编程方式运行。但我会尝试你的建议,让你知道!谢谢!
  • 我刚刚使用 11k 行和 12 列(随机 20 个字母的文本字符串)进行了快速测试,您的方法耗时 16 秒,而完成工作表耗时 3 秒。你的数据是什么样的?可以提供样张吗?
  • 哇哦,它基本上是一个产品提要,几乎每秒都会以编程方式更新。这是工作表的副本,其中我删除了实际数据,但您可以看到列。它通常有大约 10k 行数据docs.google.com/spreadsheets/d/…
  • 但老实说,有时它会起作用。这是一个有 50% 的时间有效的东西。但是您知道,这还不够:) 另外,对于其他工作表,我使用相同的脚本也遇到了同样的错误。我还有一个可能有 20 列但最多只有 3k 行的。它看起来也像一个产品提要。这里的问题是它充满了公式。但我看不出公式如何减慢脚本速度,因为它应该只粘贴值

标签: google-apps-script google-sheets


【解决方案1】:

试试这个

function cloneGoogleSheet(ssA, ssB) {
    var targetSpreadSheet = SpreadsheetApp.openById(TARGET_SPREADSHEET_ID);
    var targetSheet = targetSpreadSheet.getSheetByName(TARGET_SHEET_NAME);
    targetSpreadSheet.deleteSheet(targetSheet);
    SpreadsheetApp.openById(SOURCE_SPREADSHEET_ID).getSheetByName(SOURCE_SHEET_NAME).copyTo(targetSpreadSheet);
}

如果要重命名工作表,可以使用setName()

让我知道我的代码中是否有任何错误,或者它不起作用。

参考文献:

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#deletesheetsheet

https://developers.google.com/apps-script/reference/spreadsheet/sheet#copytospreadsheet

https://developers.google.com/apps-script/reference/spreadsheet/sheet#setnamename

【讨论】:

  • 您好,Umair,感谢您的回复。不幸的是,它给了我一个错误“目标范围和源范围必须在同一个电子表格上。(第 7 行,文件“代码”)”显然,此方法仅用于在同一张表中复制和粘贴但我喜欢你如何分组将 openById 和 getSheetByName 对象放在一行中。它可能会加快脚本速度
  • 感谢您指出这一点。我已经相应地更新了答案。
  • 对象 targetSpreadSheet.deleteSheet(targetSheet);实际上会删除整个工作表本身,而不仅仅是数据。无论如何,我想我至少发现了其中一个问题。我用 ArrayFormulas 替换了我所有的公式,现在它似乎工作得更顺畅了。听起来目标表“重量”对脚本速度有影响。这可以解释为什么@james 对同一个脚本没有任何问题
  • 谢谢@Jack。您的评论帮助我弄清楚为什么我的“粘贴”功能与一堆数据(从 23 个其他电子表格整理的 11 列 x 10,000 行)不起作用。我试图“粘贴”到依赖于“粘贴”数据的公式繁重的电子表格中。 “粘贴”到单独的电子表格中,然后将整理过的数据导入(importRange)到公式繁重的工作表中,这就是我现在要尝试的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
相关资源
最近更新 更多