google-apps-script - 如何单步执行谷歌脚本
问题描述
我正在尝试编写一个 Google 表格脚本宏。我如何逐步了解为什么超过了时间?我的问题是循环,当我将迭代最大值(场景)设置为 46 时,代码似乎运行良好,大约需要 1-2 秒。当最大值设置为 47 时,它会因超过最大执行时间(4-5 分钟)而死亡。这是怎么回事?
function testing() {
var aa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Run
Program");
var scenarios = aa.getRange("H19").getValue();
for (i = 1; i <= scenarios; i++){
var ss =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet6");
var range = ss.getRange("b6:u6");
var min = 1 ;
var max = 20 ;
var numbers = []
for (var i = min; i <= max; i++) {
numbers.push(i);
}
shuffleArray(numbers)
var counter = 0;
for (var x = 1; x <= range.getWidth(); x++) {
for (var y = 1; y <= range.getHeight(); y++) {
range.getCell(y, x).setValue(numbers[counter]);
counter++;
}
}
var range = ss.getRange("v6:ao6");
var min = 21 ;
var max = 40 ;
var numbers = []
for (var i = min; i <= max; i++) {
numbers.push(i);
}
shuffleArray(numbers)
var counter = 0;
for (var x = 1; x <= range.getWidth(); x++) {
for (var y = 1; y <= range.getHeight(); y++) {
range.getCell(y, x).setValue(numbers[counter]);
counter++;
}
}
var range = ss.getRange("ap6:at6");
var min = 41 ;
var max = 45 ;
var numbers = []
for (var i = min; i <= max; i++) {
numbers.push(i);
}
shuffleArray(numbers)
var counter = 0;
for (var x = 1; x <= range.getWidth(); x++) {
for (var y = 1; y <= range.getHeight(); y++) {
range.getCell(y, x).setValue(numbers[counter]);
counter++;
}
}
}
// function Chart4() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A1').activate();
spreadsheet.getSheetByName('Chart4').showSheet()
.activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Chart4'),
true);
};
解决方案
您的代码需要很多帮助。这是一个帮助您入门的提示。
正如其他人所提到的,您应该在整个范围内调用 .getValues() ,这将为您提供一个单元格值的二维数组 [[A1value,B1value,...],[A2val,B2val...],... ]。您应该首先获取宽度和长度并分配给一个变量。引用该变量而不是在循环条件中调用 API。事实上,由于您提前知道范围,因此您应该在主 for 循环以及电子表格 (ss) 之外定义您需要的所有范围:
var aa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Run Program");
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet6");
var range1 = ss.getRange("b6:u6");
var range2 = ss.getRange("v6:ao6");
for (i = 1; i <= scenarios; i++) { ...
如果您对 API 进行重复调用,脚本就会开始花费很长时间。
不确定你的宏到底想做什么,但这里有一个运行这种循环的模板以及你应该如何考虑它。
var range = ss.getRange(A1-style-address);
var values = range1.getValues();
var width = range1[0].length;
var height = range1.length;
var new_values = new Array();
for (var i = 0; i < height; i++) {
for (var j = 0; j < width; j++) {
//do something with values[i][j], like push to new_values
}
}
//something like:
//var new_range = ss.getRange(different A1-style address)
//new_range.setValues(new_array)
您必须确保新数组包含二维数组中的值,该数组与您将它们放入的范围具有相同的维度,否则会引发错误。
我将留给您弄清楚如何修改循环内的 new_values 数组以确保它的大小正确。
推荐阅读
- c# - 用于网络核心的 Tesseract OCR 包装器?
- ios - 无法构建 Xcode 项目:clang 错误:链接器命令失败
- c# - 如何不检查字符串c#中的大写字母?
- c++ - 如何为远程调试准备 Eclipse 设置
- c# - C# - 将字符串数组转换为字符串列表
- powershell - Save-AzrWebApp func 下载了错误的 SourcePath
- c# - 为什么我的 Umbraco 根页面只有当它是当前活动页面时才没有子页面?
- dart - FutureBuilder Flutter 中未处理的异常
- git - 尝试切换分支时出现“权限被拒绝”错误
- windows - 詹金斯奴隶无法连接到詹金斯大师