Google apps script 加速谷歌脚本值访问和元数据?

Google apps script 加速谷歌脚本值访问和元数据?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我已经编写了许多函数,它们查看单元格值,并使用它们设置其他单元格值或开发人员元数据,以及查看元数据以决定要做什么。当我对电子表格的功能进行压力测试时,我遇到了一些问题,因为为大范围的单元格运行脚本时,可能会超出预期值。 查看它,我注意到获取和设置预定义单元格的单元格值大约需要0.2秒,查找和设置元数据大约需要0.5-0.8秒。 我编写了一个示例脚本来说明这一点,但由于某些原因,时间更短,我不知道这是否与单元格中的内容有关,或者电子表格更小,或者…… 但是,更改已具有指定键的某些元数据的工作表中的

我已经编写了许多函数,它们查看单元格值,并使用它们设置其他单元格值或开发人员元数据,以及查看元数据以决定要做什么。当我对电子表格的功能进行压力测试时,我遇到了一些问题,因为为大范围的单元格运行脚本时,可能会超出预期值。
查看它,我注意到获取和设置预定义单元格的单元格值大约需要0.2秒,查找和设置元数据大约需要0.5-0.8秒。
我编写了一个示例脚本来说明这一点,但由于某些原因,时间更短,我不知道这是否与单元格中的内容有关,或者电子表格更小,或者……
但是,更改已具有指定键的某些元数据的工作表中的值并触发此脚本:

function onEdit(e){
  timetest(e)
}

function timetest(e) {
  var range = e.range;
  var sheet = range.getSheet();
  for (var r = 1; r <= range.getNumRows(); r++){
    for (var c = 1; c <= range.getNumColumns(); c++){
      var cell = range.getCell(r, c);
      var value = cell.getValue();
      var new_val = value + ' ' + r + c;
      cell.setValue(new_val);
    }
    var metadata = sheet.createDeveloperMetadataFinder().withKey("Updated").find()
    if (metadata.length > 0){
      metadata[0].setValue(new_val)
    } else {
      sheet.addDeveloperMetadata("Updated", new_val, SpreadsheetApp.DeveloperMetadataVisibility.DOCUMENT);
    }
  }
}

你知道是什么让这些电话慢了吗?有没有办法优化代码,使其尽可能快地运行?

在嵌套for循环中,您向
getCell()
getValue()
setValue()
发出请求。这会导致许多对电子表格API的远程请求,这会减慢脚本的速度

为了大大提高脚本的性能,您可以通过一次调用(
getValues()
)获取工作表上的所有数据,对其应用所需的操作,然后使用另一次调用(
setValues()
)将其设置回工作表

此外,我建议您将“元数据”操作从循环中去掉,因为它似乎只与
new\u val
的最后一个值有关。这些修改后的最终代码可能如下所示:

函数onEdit(e){
时间测试(e)
}
功能时间测试(e){
var范围=e范围;
var sheet=range.getSheet();
var data=range.getValues();
var new_val;
对于(变量i=0;i 0){
var metadata=sheet.createDeveloperMetadataFinder().withKey(“更新”).find()
如果(metadata.length>0){
元数据[0]。设置值(新值)
}否则{
sheet.addDeveloperMetadata(“更新”,新版本,电子表格app.developerMetadata.DOCUMENT);
}
}
}
最后,我建议你退房

配额
  • 简单触发器的执行限制为30秒
  • “安装”onEdit触发器时,该执行限制将增加到“正常”脚本运行时的级别,即消费者6分钟,免费G套件和基本G套件/Gov,早期访问和商业/企业/教育G套件30分钟
  • 每日允许的总触发器运行时间为每个消费者帐户90分钟,对于G套件免费版帐户为3小时,对于更高级别的帐户为6小时
工具书类

您看过文档中的“最佳实践”了吗?嘿,kajsa,我提供了一个答案,希望能对您有所帮助。如果您有任何问题,请告诉我。Cheers@carlesgg97遗憾的是,这并没有帮助,因为示例代码只是一个示例,而不是我在完整文件中实际执行的操作,因为我实际需要执行的是相当多的长函数。然而,我试图解决的问题是,这些精确的呼叫需要很长时间。我想也许有某种格式可以提高速度。事实上,我唯一的选择似乎是从对电子表格文件的外部调用中使用API,因为所有其他选项都会超时。嘿@Kajsa,我的回答的想法是传达出发出几个外部调用(通过使用内置类、扩展服务和urlfetchapp调用)会严重影响您的性能(因为它们通常是按顺序运行的,以阻塞的方式)。请问,您最后一句话“实际上,我唯一的选择似乎是从对电子表格文件的外部调用中使用API,因为所有其他选项都会超时”是什么意思?干杯我的意思是,由于执行时间超过30秒,在google脚本环境中运行函数会遇到超时错误。我将要做的是使用python和gspread包从外部服务器连接到工作表,然后通过此连接请求数据。到目前为止,这运行起来更加顺畅以及给了我一套更强大的工具。
[19-11-21 01:05:44:105 PST] Starting execution
[19-11-21 01:05:44:252 PST] PropertiesService.getDocumentProperties() [0.14 seconds]
[19-11-21 01:05:44:253 PST] SpreadsheetApp.Range.getSheet() [0 seconds]
[19-11-21 01:05:44:254 PST] SpreadsheetApp.Range.getNumRows() [0 seconds]
[19-11-21 01:05:44:254 PST] SpreadsheetApp.Range.getNumColumns() [0 seconds]
[19-11-21 01:05:44:255 PST] SpreadsheetApp.Range.getCell([1, 1]) [0 seconds]
[19-11-21 01:05:44:357 PST] SpreadsheetApp.Range.getValue() [0.101 seconds]
[19-11-21 01:05:44:413 PST] SpreadsheetApp.Range.setValue([p 12 11]) [0.056 seconds]
[19-11-21 01:05:44:413 PST] SpreadsheetApp.Range.getNumColumns() [0 seconds]
[19-11-21 01:05:44:414 PST] SpreadsheetApp.Sheet.createDeveloperMetadataFinder() [0 seconds]
[19-11-21 01:05:44:414 PST] SpreadsheetApp.DeveloperMetadataFinder.withKey([Updated]) [0 seconds]
[19-11-21 01:05:44:682 PST] SpreadsheetApp.DeveloperMetadataFinder.find() [0.267 seconds]
[19-11-21 01:05:44:836 PST] SpreadsheetApp.DeveloperMetadata.setValue([p 12 11]) [0.153 seconds]