因爲我對Javascript/GAS還不太熟悉,所以我再次回到SO來解決GAS問題。基於處理函數調用的方法,以有效的方式處理腳本的速度有點慢,我遇到了一些麻煩。Google Apps腳本電子表格範圍處理(Get-Process-Set; Set Not Working)
我讀過幾個地方(啊,這是here),即做一個「讀所有」,然後「寫全」爲得到的解析設置值(在電子表格中至少)是更快比做一個「得到一個,寫一個」方法(由於顯而易見的原因,這是有道理的)。
我知道如何獲得範圍內的所有值,但我不確定如何通過(多維)數組,處理數據並相應地設置新的範圍。
問題:該功能需要大約2秒鐘啓動,大約需要5秒鐘才能運行50行。問題是,我可能會在這個電子表格中有成千上萬的行,並且要讓這個函數運行到確保數據被正確地後處理,以便Boomerang Calendar正確地獲取時間數據在我看來是有點荒謬的。腳本需要處理的每一列數據需要兩倍的時間,這是可怕的。我擔心在下學期我會經常過去我的「GAS處理時限」。
這裏是起點代碼(不好,我承認):
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);
}
}
這是高度相關的我的previous question有關修復這是打破迴旋鏢日曆功能調度事件的時間格式的撇號問題。
解決方案:使用Range.getValues()
函數將值從範圍拖到二維數組中。處理2D數組中的每個值(逐行可能是最合乎邏輯的方法),然後更新編輯值的索引和新值(請參閱代碼中的回答註釋)。之後,使用Range.setValues(2Darray)
將2D陣列中的元素放回到原始範圍中。我希望這可以幫助你,如果你遇到它!這也是很多比我原來的代碼中多次調用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
}
感謝您搭建的解決方案。我一直有一些問題得到範圍值的工作,這讓我很對。榮譽;並熱愛全面評論! – MrGreggles
@GreggCleland這是我第一次開始用GAS編碼。開始時,它非常混亂,以前從未使用Javascript,所以我想確保我評論它,以便知道所有呼叫發生了什麼:P如果這對您有幫助,請隨時致電;) –