Uma planilha possui uma matriz 50x36 com valores. A função deve obter valores de determinadas colunas e construir um array se a célula col+1 for maior que 0. A primeira parte do código é chamar a página uma vez, obtendo todos os valores em uma linha, depois com for aninhado e um if, criando a matriz desejada. A segunda parte é fazer exatamente a mesma coisa, mas chamar a página com getValues() várias vezes, o que deveria ser mais lento e não é uma boa prática de acordo com o Google. O primeiro produz um resultado 100 ms mais lento que o segundo. Alguém pode explicar?
function PieseArray() {
let pag = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Configuracion');
//start counting time for the first part
let start1 = new Date
let allTheParts = pag.getRange(11,40,50,36).getValues()
let array2=[]
for (let i=0;i<36;i=i+4){
for (let j=0;j<allTheParts.length;j++){
if(allTheParts[j][i+1]>0){
array2.push([allTheParts[j][i],allTheParts[j][i+1]])
}
}
}
let end1 = new Date
Logger.log(end1-start1)
//start of the second part
let start2 = new Date
let piese = []
for(let k=40;k<=72;k=k+4){
piese = piese.concat(pag.getRange(11,k,50,2).getValues())
}
let array1=[]
for (let i=0;i<piese.length;i++){
if(piese[i][1]!=''){
array1.push(piese[i])
}
}
let end2 = new Date
Logger.log(end2-start2)
return(array1)
}
Registro de execução
1:06:11 PM Notice Execution started
1:06:12 PM Info 107.0 (first part)
1:06:12 PM Info 15.0 (second part)
1:06:12 PM Notice Execution completed
O resultado é o mesmo array, mas o tempo de execução é muito estranho. Eu esperava que a segunda parte do código fosse bem mais lenta.
Experimente assim:
Ambos os códigos não estão fazendo a mesma coisa. A comparação principal é diferente.
é diferente de
Além disso, o script do Apps possui cache lookahead , onde os valores necessários já estão armazenados em cache. Se você executar o código um após o outro, obtendo os mesmos valores do mesmo intervalo, os valores armazenados em cache do primeiro código serão usados no segundo.
Para cronometrar adequadamente essas funções,
console.time
econsole.timeEnd
para cronometrar corretamente as funções