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小时
[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]