我再次回到 SO 来解决 GAS 问题,因为我对 Javascript/GAS 还不太熟悉。我对基于有效方式处理函数调用的方法的脚本运行速度有多慢感到有些麻烦。
我读过好几个地方(啊,是here https://developers.google.com/apps-script/best_practices#OptimizeScripts),做一个“全部读取”然后“全部写入”以获取解析设置值(至少在电子表格中)是faster比做一个“取一,写一”方法(出于显而易见的原因,这是有道理的)。
我知道如何获取范围内的所有值,但我不太确定如何遍历(多维)数组、处理数据并设置新的 Range因此。
问题:该函数启动大约需要2秒,运行50行大约需要5秒。问题是,我可能会在这个电子表格中有数千行,并且要让这个函数运行到ensure在我看来,数据经过正确的后处理,以便 Boomerang Calendar 正确获取时间数据,这有点荒谬。该脚本需要处理每列数据所需的时间是原来的两倍,这是可怕的。我担心在下个学期我会经常超出我的“气体处理时间限制”。
这是起始代码(不好,我承认):
function fixApostrophes() {
// Get the active spreadsheet to run the script on
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Get the active sheet within the document to run the script on
var sheet = spreadsheet.getActiveSheet();
// Get max number of rows needed to process
var maxRows = sheet.getLastRow();
// Get the range for the startTime column and endTime column
var apostropheRange = sheet.getRange(1, 10, maxRows, 2);
// Get the value in each cell, remove apostrophes from the start,
// and replace the value in that cell
for (var i = 1; i < apostropheRange.getNumRows(); ++i) {
// Get the cells for startTime and endTime to speed things up a bit
var startCell = apostropheRange.getCell(i, 1);
var endCell = apostropheRange.getCell(i, 2);
// Get the values for startTime and endTime
var startTime = startCell.getValue();
var endTime = endCell.getValue();
// Remove apostrophes from start of startTime
while(startTime.charAt(0) == "'") {
startTime = startTime.substring(1);
}
// Remove apostrophes from start of startTime
while(endTime.charAt(0) == "'") {
endTime = endTime.substring(1);
}
// Set the values for startTime and endTime
startCell.setValue(startTime);
endCell.setValue(endTime);
}
}
这和我的情况有很大关系上一个问题 https://stackoverflow.com/questions/15991777/google-apps-script-on-form-submit-time-formatting-glitch-fix关于修复时间格式撇号问题,该问题破坏了用于安排事件的 Boomerang 日历功能。
解决方案:使用以下命令将 Range 中的值拉入二维数组Range.getValues()
功能。处理二维数组中的每个值(逐行可能是最合乎逻辑的方法),然后update编辑值与新值的索引(请参阅代码中的 Srik-answer 注释)。之后,使用以下方法将 2D 数组中的元素放回到原始 Range 中Range.setValues(2Darray)
。如果您遇到它,我希望这对您有所帮助!这也是much比我的原始代码中多次调用 API 更快。
function myNewLibraryFunction(startCol, numColumns) {
// Get the active spreadsheet to run the script on
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Get the active sheet within the document to run the script on
var sheet = spreadsheet.getActiveSheet();
// Get max number of rows needed to process
var maxRows = sheet.getLastRow();
// Get the range for the startTime column and endTime column
var dataRange = sheet.getRange(1, startCol, maxRows, numColumns);
var values = dataRange.getValues();
// Get the value in each cell, remove apostrophes from the start,
// and replace the value in that cell
for (var i = 1; i < maxRows; ++i) {
// Get the values for startTime and endTime
var startTime = values[i][0];
var endTime = values[i][1];
// Remove apostrophes from start of startTime
while(startTime.charAt(0) == "'") {
startTime = startTime.substring(1);
}
// Remove apostrophes from start of startTime
while(endTime.charAt(0) == "'") {
endTime = endTime.substring(1);
}
values[i][0] = startTime; // New stuff from Srik's answer
values[i][1] = endTime; // New stuff from Srik's answer
}
dataRange.setValues(values);
SpreadsheetApp.flush(); // New stuff from Srik's answer
}