https://i.stack.imgur.com/7VAJk.png
我想從“dB”表 A5:A29 復制資料并粘貼到正確的列。所以我使用腳本來找到正確的列。
范圍 B2:CX2 有 0(不正確)或 1(正確)值,所以我使用 'for' & 'if' 但是!!太耽誤了!!我使用 console.time() 得到 25909ms(timecheck2 value) !!!
請幫我.....
這是我的代碼
function save(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('dB');
console.time("timecheck1");
//find last row
var copyrangeO = sheet.getRange(5,1,25,1).getValues();
var lastrowO = copyrangeO.filter(String).length;
var copyrange = sheet.getRange(5,1,lastrowO,1);
console.timeEnd("timecheck1");
//my dB data start "B2".
var cv = 1;
//find correct value(1). B2 ~ CX2 (#100)
console.time("timecheck2");
for (var i=2; i<101;i ){
if(sheet.getRange(2,i).getValue()===1){
cv = i;
}
}
console.timeEnd("timecheck2");
//if data isn't correct, cv===1. so error msg print.
console.time("timecheck3");
if(cv ===1){
Browser.msgBox("ERROR")
}else {
//data copy and paste.
var columnToCheck = sheet.getRange(4,cv,1000).getValues();
var lastrow = getLastRowSpecial(columnToCheck);
var pasterange = sheet.getRange(lastrow 4,cv);
copyrange.copyTo(pasterange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
Browser.msgBox(lastrowO " saved!");
}
console.timeEnd("timecheck3");
}
uj5u.com熱心網友回復:
問題:
如果我正確理解您的情況,您想找到B2:CX2值為的單元格1,但腳本為此花費了太多時間。
這里的問題是您在回圈中使用getRange和getValue ( sheet.getRange(2,i).getValue()===1)。這會大大增加對 Sheets 服務的呼叫量,從而減慢腳本速度,正如您在最小化對其他服務的呼叫中所見。
解決方案:
在這種情況下,我建議執行以下操作:
- 使用getValues()一次從所有列中獲取值。
- 使用findIndex獲取值為 的列索引
1。
為此,請替換以下內容:
var cv = 1;
//find correct value(1). B2 ~ CX2 (#100)
console.time("timecheck2");
for (var i=2; i<101;i ){
if(sheet.getRange(2,i).getValue()===1){
cv = i;
}
}
有了這個:
var ROW_INDEX = 2;
var FIRST_COLUMN = 2; // Column B
var LAST_COLUMN = 102; // Column CX
var columnValues = sheet.getRange(ROW_INDEX, FIRST_COLUMN, 1, LAST_COLUMN-FIRST_COLUMN 1).getValues()[0];
var cv = columnValues.findIndex(columnValue => columnValue === 1) FIRST_COLUMN;
筆記:
如果有與價值的范圍內,沒有細胞1,findIndex恢復-1其,加FIRST_COLUMN,結果1。這適用于您當前的腳本,但如果FIRST_COLUMN停止為 則不起作用2,因此請注意這一點(要么將條件更改if(cv ===1){為不那么嚴格,要么不要將結果值分配給cviffindIndex回傳-1)。
uj5u.com熱心網友回復:
該函式將大部分時間花在for回圈中,因為它Range.getValue()多次重復呼叫。您可以通過一次 Range.getValues()呼叫獲取所有值來加快速度,如下所示:
let cv = 1;
console.time("timecheck2");
sheet.getRange('B2:B100').getValues().flat()
.some((value, index) => (cv = 2 index) && value === 1);
console.timeEnd("timecheck2");
請注意,這不是一種最簡潔的查找方式cv,但它應該有助于說明您遇到性能問題的原因。您可能想要完全重寫代碼,使用宣告式而不是命令式樣式。
uj5u.com熱心網友回復:
嘗試這個:
我不知道你在保存中做什么,因為沒有提供輔助函式代碼。
function save(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName('dB');
var vs0 = sh.getRange(5,1,25,1).getValues();
var lr0 = vs0.filter(String).length;
var crg = sh.getRange(5,1,lr0,1);
var cv = 1;
const vs1 = sh.getRange(2,2,1,99).getValues().forEach((c,i) => {
if(c == 1)cv = i 2
})
if(cv == 1){
Browser.msgBox("ERROR")
}else {
var vs2 = sh.getRange(4,cv,1000).getValues();
var lastrow = getLastRowSpecial(vs2);
var drg = sh.getRange(lastrow 4,cv);
crg.copyTo(drg, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
Browser.msgBox(lr0 " saved!");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/343981.html
標籤:javascript 谷歌应用程序脚本 谷歌表格 优化
下一篇:單擊該單元格時如何切換單元格顏色
