1个单元格范围的Range.getValue()需要3到7秒才能执行

时间:2017-10-29 18:28:06

标签: google-apps-script google-sheets

我有一个脚本,曾经在一分钟内运行良好。最近我开始得到超过最长执行时间"错误表明它现在打破了6分钟的限制。

使用'执行记录'我发现我做的少量getValue()和getValues()调用需要很长时间,所以我进行了实验。

以下测试功能需要3到7秒才能执行:

function test_singleCellRange_getValue() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Marcin');
  var range = sheet.getRange(1, 1);
  var value = range.getValue();
}

'执行记录'表明getValue()调用一直占用:

[17-10-29 14:15:00:002 EDT] Starting execution
[17-10-29 14:15:00:019 EDT] SpreadsheetApp.getActive() [0 seconds]
[17-10-29 14:15:00:074 EDT] Spreadsheet.getSheetByName([Marcin]) [0.054 seconds]
[17-10-29 14:15:00:075 EDT] Sheet.getRange([1, 1]) [0 seconds]
[17-10-29 14:15:07:377 EDT] Range.getValue() [7.301 seconds]
[17-10-29 14:15:07:381 EDT] Execution succeeded [7.36 seconds total runtime]

单个单元格包含常量字符串值(即没有公式)。 getValue()的这种令人沮丧的表现是否正常(即Google服务器所期望的新性能标准),还是我可以采取哪些措施来提高性能?

更新

getValue()的效果似乎受到电子表格大小的严重影响。即使上述代码在单个单元格范围内执行getValue(),其性能似乎也会受到电子表格整体大小的影响。

这没有任何意义 - 任何人都有经验吗?这是Google设计API的方式还是这个错误?

2 个答案:

答案 0 :(得分:1)

如何使用Sheets API v4?请将此视为几个答案之一。当我在Spreadsheet中处理大数据时,由于处理速度的原因,我经常使用Sheets API。我不知道这个示例脚本是否对您的情况有用。如果这对你没用,我很抱歉。

示例脚本:

此示例脚本可以使用您的脚本检索相同的结果。

var sheetId = "### Spreadsheet ID ###";
var range = "Sheet1!A1:A1";
var value = Sheets.Spreadsheets.Values.get(sheetId, range);
// Logger.log(value.values)

要使用此脚本,请按以下步骤启用Sheets API for Advanced Google Services和API控制台。

在高级Google服务中启用表格API v4

  • 在脚本编辑器上
    • 资源 - >高级Google服务
    • 启用Google表格API v4

在API控制台启用Sheets API v4

  • 在脚本编辑器上
    • 资源 - >云平台项目
    • 查看API控制台
    • 在“入门”中,单击“启用API”并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索API&服务,输入"表"。然后点击Google表格API。
    • 单击“启用”按钮。

参考文献:

答案 1 :(得分:0)

我们无法直接采取任何措施来改善此类剧本的效果。

众所周知,调用Google Apps脚本服务的速度很慢。

有关更复杂的脚本,请查看Best Practices上发布的官方指南。