[英]Apps Script running slowing moving values from one sheet to another
我之前發布過一個類似的問題並收到了一個很好的建議,但這個問題略有不同。 我正在將單元格中的數據從一張紙復制到另一張紙,但目的地略有不同。 有沒有更快的方法來做到這一點? 我知道獲取和設置值會減慢速度,但是,我不確定如何將值分配給數組並設置在正確的單元格中。
下面的代碼,建議將不勝感激。
謝謝法茲拉
for (var i = 0; i < simsTimetableLastRow; i++) {
try {
if(searchRangeVals[i][0].indexOf("Timetable") > -1) {
copyRows = simsTimetable.getRange(i + 1, 1, 2, 11);
pasteRowsLoc = newTimetable.getRange(j + 1, 1, 2, 11).setValues(copyRows.getValues());
copyRows.copyFormatToRange(newTimetable, 1, 11, j + 1, j + 3);
pasteTemplateLoc = newTimetable.getRange(j + 4, 1, 25, 11);
pasteTemplateLoc.setValues(templateVals);
template.copyFormatToRange(newTimetable, 1, 11, j + 4, j + 25);
period1To2 = simsTimetable.getRange(i + 6, 2, 4, 11).getValues();
newTimetable.getRange(j + 6, 2, 4, 11).setValues(period1To2);
period3 = simsTimetable.getRange(i + 11, 2, 2, 11).getValues();
newTimetable.getRange(j + 10, 2, 2, 11).setValues(period3);
period3To4 = simsTimetable.getRange(i + 11, 2, 4, 11).getValues();
newTimetable.getRange(j + 14, 2, 4, 11).setValues(period3To4);
period5 = simsTimetable.getRange(i + 15, 2, 2, 11).getValues();
newTimetable.getRange(j + 18, 2, 2, 11).setValues(period5);
newTimetable.getRange(j + 22, 2, 2, 11).setValues(period5);
period6ToReg = simsTimetable.getRange(i + 19, 2, 4, 11).getValues();
newTimetable.getRange(j + 24, 2, 4, 11).setValues(period6ToReg);
j = j + 33;
}
} catch(e) {
Logger.log(i);
}
}
與處理分配的 memory 中的數據相比,當您的腳本與電子表格交互時,處理時間要長得多。 因此,為了加快速度,您最好將電子表格中所需的所有數據提取到 memory 中的一個 go 中,然后在另一個 Z34D1F91FB2E514B8576FABA6BZ 中寫回您需要的所有數據。
因此,與其逐行獲取值,不如從相關工作表中獲取所有值,例如:
var data = simsTimetable.getRange(2, 1, simsTimetable.getLastRow()-1, simsTimetable.getLastColumn());
並在腳本中使用它。
同樣,不是每次都寫入新工作表,而是啟動一個臨時數組
var tempArray = [];
每當您寫入時,只需將數據逐行推送到此數組中。
請注意,您必須做一些數學運算才能從data
數組中獲取正確的數據,並且還必須以一種您可以一步將其寫入新工作表的方式構建您的tempArray
,但這是非常值得的。 出於實際原因,您可能需要重新考慮您的電子表格結構(以便從/復制到的列)彼此相鄰,但您可能已經很幸運了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.