脚本超时,即使代码似乎没有问题



我是一个新的,这是变得令人沮丧的被卡住在过去的几天里,我很高兴有你的输入我的代码,这是一个谷歌脚本,已经运行了相当长一段时间,但我猜数据变得越来越大,我的功能超时每次触发。我似乎不明白如何优化它。

我有一个循环,迭代发生,我正在寻找方法来减少运行时间

type here
function Serio() {
const sss = SpreadsheetApp.getActiveSpreadsheet();
const ssSetting = sss.getSheetByName('Labs');
var tss = sss.getSheetByName("Finished");
var clearseriosh = sss.getSheetByName("Serio");
clearseriosh.getRange(2, 1,clearseriosh.getLastRow(), clearseriosh.getLastColumn()).clearContent();

const serioLabs = tss.getRange("M2:M").getValues(); 
const seriotag = tss.getRange("J2:J").getValues();
const serioprod = tss.getRange("L2:L").getValues();
const ts = sss.getSheetByName('Serio');
for (var i = 0; i < seriolabs.length; i++) {
try{
if(seriolabs[i][0] != '' &&seriolabs [i][0] != '#REF'){
var shellunitlink = seriolabs[i][0];
var shellunitId = shellunitlink.substring(xx,xx);
var tag = seriotag[i];
var prod = serioprod [i];
const sourcesheetSerio =  SpreadsheetApp.openById(shellunitId);   
const sourceSerio = sourcesheetSerio.getSheetByName("Arrivals");
const ts = sss.getSheetByName('Serio');
if(sourceSerio){      
const rawData = sourceSerio.getRange("C2:I").getValues().map(([
A,B,C,D,E,F,G,H,I]) => ["Serio",tag,prod,A,B,C,D,E,F,G,H,I,shellunitlink]);
const rrawData=rawData.filter(row=>row[0]=="Serio" && row[1]==tag && row[2]==prod && row[3]!=""&& row[4]=="toxic");
if(rrawData.length > 0 ){
ts.getRange(ts.getLastRow()+1, 1, rrawData.length,13).setValues(rrawData);
}
const rrawData1=rawData.filter(row=>row[0]=="Serio" && row[1]==tag && row[2]==prod && row[3]!=""&& row[4]=="NA");
if(rrawData1.length > 0 ){
ts.getRange(ts.getLastRow()+1, 1, rrawData1.length,13).setValues(rrawData1);
}
const rrawData2=rawData.filter(row=>row[0]=="Serio" && row[1]==tag && row[2]==prod && row[3]!=""&& row[4]=="eco");
if(rrawData2.length > 0 ){
ts.getRange(ts.getLastRow()+1, 1, rrawData2.length,13).setValues(rrawData2);
}
}
}}
catch(e) {
continue;//If error continue looping
}}

}

我不能测试它,我希望我抓住了我所有的打字错误,等等。但我认为这是可行的。

我通常使用值数组的索引,而不是定义单独的变量。

首先,我把所有的值从工作表到seriosValues,删除标题。

然后,我过滤每个表格的列A !== "。然后将标记和prod与行值连接起来。过滤每个"有毒","无";和";eco"组。catch return与for循环中的continue相同。

现在我已经收集了rrawData中所有的行,我写入电子表格。

function Serio() {
let sss = SpreadsheetApp.getActiveSpreadsheet();
let ssSetting = sss.getSheetByName('Labs');
let tss = sss.getSheetByName("Finished");
let ts = sss.getSheetByName("Serio");
ts.getRange(2, 1,ts.getLastRow(), ts.getLastColumn()).clearContent();
let seriosValues = tss.getDataRange().getValues();
seriosValues.shift(); // remove headers
let rawData = [];
let rrawData = [];
seriosValuesforEach( seriosRow => {
if( ( seriosRow[0] !== "" ) && ( seriosRow[0] !== "#REF" ) ) {
let shellunitId = seriosRow[0].substring(xx,xx);
try {
let sourcesheetSerio =  SpreadsheetApp.openById(shellunitId);   
let sourceSerio = sourcesheetSerio.getSheetByName("Arrivals");
if( sourceSerio ) {
rawData = sourceSerio.getRange(2,3,sourceSerio.getLastRow()-1,9).getValues();
rawData = rawData.filter( rawRow => rawRow[0] !== "" );  // filter A !== ""
rawData = rawData.map( rawRow => ["Serio",tag,prod].concat(rawRow,seriosRow[0]) );
// all rows or rawData have "Serio",tag,prod
rawData.forEach( rawRow => {
if( rawRow[4] === "toxic" ) rrawData.push(rawRow);
}
);
rawData.forEach( rawRow => {
if( rawRow[4] === "NA" ) rrawData.push(rawRow);
}
);
rawData.forEach( rawRow => {
if( rawRow[4] === "eco" ) rrawData.push(rawRow);
}
);
}
}
catch(err) {
Logger.log("Error in Serio: "+err);
return;
}
}
}
);
if( rrawData.length > 0 ) {
ts.getRange(ts.getLastRow()+1, 1, rrawData.length,13).setValues(rrawData);
}
}

最新更新