减少脚本的处理成本
Reducing process cost of a script
我正在构建一个 Google Sheet,它有两个主要工作表:(i) 包含数据的用户界面(名称:“Interface Boletagem” - 让我们称之为 Sheet A) 和 (ii) 存储数据的数据库(名称:“Boletador (Dados)” - 我们称之为 Sheet B)。
我已经有一个脚本得到了优化,感谢这个论坛的贡献者将数据从 Sheet A 传输到 Sheet B 的最后一个空白行。
function submitDataOutbound(){
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var shUserForm = myGoogleSheet.getSheetByName("Interface Boletagem");
var datasheet = myGoogleSheet.getSheetByName("Boletador (Dados)");
var ui = SpreadsheetApp.getUi();
var columnToCheck = datasheet.getRange("A:A").getValues();
function getLastRowSpecial(range) {
var rowNum = 0;
var blank = false;
for (var row = 0; row < range.length; row++)
if (range[row][0] === "" && !blank) {
rowNum = row;
blank = true;
} else if (range[row][0] !== "") {
blank = false;
};
return rowNum;
};
var blankRow = getLastRowSpecial(columnToCheck) + 1;
var ranges1 = ["G26", "G27", "G11", "G12", "G21", "G22", "G23", "G24", "G20", "G6", "G28", "G7", "G16", "G8", "G9", "G10", "G14", "G13", "G17", "G19", "G18", "G15"];
var values = Sheets.Spreadsheets.Values.batchGet(myGoogleSheet.getId(), { ranges: ranges1.map(e => `'Interface Boletagem'!${e}`) }).valueRanges.map(({ values }) => values[0][0]);
datasheet.getRange(blankRow, 1, 1, values.length).setValues([values]);
ui.alert('Boletado');
shUserForm.getRange(6, 7, 14).clear().setBackground('#BEBEBE');
}
数据存储到 Sheet B 后,进行了一些计算,我需要用 Sheet A 中新创建的行中的数据填充位于 Sheet A 下的两个汇总表19=] B. 现在我有一个功能脚本(如下),但是需要很长时间才能 运行。有关如何优化它的任何提示?
function buildTables(){
var myGoogleSheet=SpreadsheetApp.getActiveSpreadsheet();
var datasheet=myGoogleSheet.getSheetByName("Boletador (Dados)");
var sheetdest=myGoogleSheet.getSheetByName("Interface Boletagem");
var columnToCheck = datasheet.getRange("A:A").getValues();
function getLastRowSpecial(range){
var rowNum = 0;
var blank = false;
for(var row = 0; row < range.length; row++)
if(range[row][0] === "" && !blank){
rowNum = row;
blank = true;
}else if(range[row][0] !== ""){
blank = false;
};
return rowNum;
};
var blankRow=getLastRowSpecial(columnToCheck);
sheetdest.getRange("C36").setValue(datasheet.getRange(blankRow,10).getValue());//ClienteBco
sheetdest.getRange("C53").setValue(datasheet.getRange(blankRow,10).getValue());//ClienteCli
sheetdest.getRange("C37").setValue(datasheet.getRange(blankRow,9).getValue());//CNPJBco
sheetdest.getRange("C54").setValue(datasheet.getRange(blankRow,9).getValue());//CNPJCli
sheetdest.getRange("C38").setValue(datasheet.getRange(blankRow,11).getValue());//compravendaBco
sheetdest.getRange("C55").setValue(datasheet.getRange(blankRow,11).getValue());//compravendaCli
sheetdest.getRange("C39").setValue(datasheet.getRange(blankRow,12).getValue());//moedaBco
sheetdest.getRange("C56").setValue(datasheet.getRange(blankRow,12).getValue());//moedaCli
sheetdest.getRange("C40").setValue(datasheet.getRange(blankRow,14).getValue());//ValorMEBco
sheetdest.getRange("C57").setValue(datasheet.getRange(blankRow,14).getValue());//ValorMECli
sheetdest.getRange("C41").setValue(datasheet.getRange(blankRow,15).getValue());//TxBcoBco
sheetdest.getRange("C42").setValue(datasheet.getRange(blankRow,16).getValue());//TxCliBco
sheetdest.getRange("C58").setValue(datasheet.getRange(blankRow,16).getValue());//TxCambioCli
sheetdest.getRange("C43").setValue(datasheet.getRange(blankRow,17).getValue());//IOFBco
sheetdest.getRange("C59").setValue(datasheet.getRange(blankRow,17).getValue());//IOFCli
sheetdest.getRange("C44").setValue(datasheet.getRange(blankRow,26).getValue());//IOFValorBco
sheetdest.getRange("C60").setValue(datasheet.getRange(blankRow,26).getValue());//IOFValorCli
sheetdest.getRange("C45").setValue(datasheet.getRange(blankRow,18).getValue());//TarifaBco
sheetdest.getRange("C61").setValue(datasheet.getRange(blankRow,18).getValue());//TarifaCli
sheetdest.getRange("C46").setValue(datasheet.getRange(blankRow,27).getValue());//IRValorBco
sheetdest.getRange("C62").setValue(datasheet.getRange(blankRow,27).getValue());//IRValorCli
sheetdest.getRange("C47").setValue(datasheet.getRange(blankRow,28).getValue());//ValorBRLBco
sheetdest.getRange("C63").setValue(datasheet.getRange(blankRow,28).getValue());//ValorBRLCli
sheetdest.getRange("C48").setValue(datasheet.getRange(blankRow,3).getValue());//ValutaBRLBco
sheetdest.getRange("C64").setValue(datasheet.getRange(blankRow,3).getValue());//ValutaBRLCli
sheetdest.getRange("C49").setValue(datasheet.getRange(blankRow,4).getValue());//ValutaMEBco
sheetdest.getRange("C65").setValue(datasheet.getRange(blankRow,4).getValue());//ValutaMECli
}
我相信你的目标如下。
- 您想减少脚本的处理成本。
在这种情况下,我想建议使用表格API。当Sheets API用于你的脚本时,它变成如下。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function buildTables2() {
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var datasheet = myGoogleSheet.getSheetByName("Boletador (Dados)");
var columnToCheck = datasheet.getRange("A:A").getValues();
function getLastRowSpecial(range) {
var rowNum = 0;
var blank = false;
for (var row = 0; row < range.length; row++)
if (range[row][0] === "" && !blank) {
rowNum = row;
blank = true;
} else if (range[row][0] !== "") {
blank = false;
};
return rowNum;
};
var blankRow = getLastRowSpecial(columnToCheck);
var src = ["J", "J", "I", "I", "K", "K", "L", "L", "N", "N", "O", "P", "P", "Q", "Q", "Z", "Z", "R", "R", "AA", "AA", "AB", "AB", "C", "C", "D", "D"].map(e => `'Boletador (Dados)'!${e + blankRow}`);
var dst = ["C36", "C53", "C37", "C54", "C38", "C55", "C39", "C56", "C40", "C57", "C41", "C42", "C58", "C43", "C59", "C44", "C60", "C45", "C61", "C46", "C62", "C47", "C63", "C48", "C64", "C49", "C65"].map(e => `'Interface Boletagem'!${e}`);
var ssId = myGoogleSheet.getId();
var values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: src }).valueRanges.map(({ values }) => values ? values[0][0] : "");
var data = values.map((e, i) => ({ values: [[e]], range: dst[i] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ssId);
}
参考文献:
我正在构建一个 Google Sheet,它有两个主要工作表:(i) 包含数据的用户界面(名称:“Interface Boletagem” - 让我们称之为 Sheet A) 和 (ii) 存储数据的数据库(名称:“Boletador (Dados)” - 我们称之为 Sheet B)。
我已经有一个脚本得到了优化,感谢这个论坛的贡献者将数据从 Sheet A 传输到 Sheet B 的最后一个空白行。
function submitDataOutbound(){
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var shUserForm = myGoogleSheet.getSheetByName("Interface Boletagem");
var datasheet = myGoogleSheet.getSheetByName("Boletador (Dados)");
var ui = SpreadsheetApp.getUi();
var columnToCheck = datasheet.getRange("A:A").getValues();
function getLastRowSpecial(range) {
var rowNum = 0;
var blank = false;
for (var row = 0; row < range.length; row++)
if (range[row][0] === "" && !blank) {
rowNum = row;
blank = true;
} else if (range[row][0] !== "") {
blank = false;
};
return rowNum;
};
var blankRow = getLastRowSpecial(columnToCheck) + 1;
var ranges1 = ["G26", "G27", "G11", "G12", "G21", "G22", "G23", "G24", "G20", "G6", "G28", "G7", "G16", "G8", "G9", "G10", "G14", "G13", "G17", "G19", "G18", "G15"];
var values = Sheets.Spreadsheets.Values.batchGet(myGoogleSheet.getId(), { ranges: ranges1.map(e => `'Interface Boletagem'!${e}`) }).valueRanges.map(({ values }) => values[0][0]);
datasheet.getRange(blankRow, 1, 1, values.length).setValues([values]);
ui.alert('Boletado');
shUserForm.getRange(6, 7, 14).clear().setBackground('#BEBEBE');
}
数据存储到 Sheet B 后,进行了一些计算,我需要用 Sheet A 中新创建的行中的数据填充位于 Sheet A 下的两个汇总表19=] B. 现在我有一个功能脚本(如下),但是需要很长时间才能 运行。有关如何优化它的任何提示?
function buildTables(){
var myGoogleSheet=SpreadsheetApp.getActiveSpreadsheet();
var datasheet=myGoogleSheet.getSheetByName("Boletador (Dados)");
var sheetdest=myGoogleSheet.getSheetByName("Interface Boletagem");
var columnToCheck = datasheet.getRange("A:A").getValues();
function getLastRowSpecial(range){
var rowNum = 0;
var blank = false;
for(var row = 0; row < range.length; row++)
if(range[row][0] === "" && !blank){
rowNum = row;
blank = true;
}else if(range[row][0] !== ""){
blank = false;
};
return rowNum;
};
var blankRow=getLastRowSpecial(columnToCheck);
sheetdest.getRange("C36").setValue(datasheet.getRange(blankRow,10).getValue());//ClienteBco
sheetdest.getRange("C53").setValue(datasheet.getRange(blankRow,10).getValue());//ClienteCli
sheetdest.getRange("C37").setValue(datasheet.getRange(blankRow,9).getValue());//CNPJBco
sheetdest.getRange("C54").setValue(datasheet.getRange(blankRow,9).getValue());//CNPJCli
sheetdest.getRange("C38").setValue(datasheet.getRange(blankRow,11).getValue());//compravendaBco
sheetdest.getRange("C55").setValue(datasheet.getRange(blankRow,11).getValue());//compravendaCli
sheetdest.getRange("C39").setValue(datasheet.getRange(blankRow,12).getValue());//moedaBco
sheetdest.getRange("C56").setValue(datasheet.getRange(blankRow,12).getValue());//moedaCli
sheetdest.getRange("C40").setValue(datasheet.getRange(blankRow,14).getValue());//ValorMEBco
sheetdest.getRange("C57").setValue(datasheet.getRange(blankRow,14).getValue());//ValorMECli
sheetdest.getRange("C41").setValue(datasheet.getRange(blankRow,15).getValue());//TxBcoBco
sheetdest.getRange("C42").setValue(datasheet.getRange(blankRow,16).getValue());//TxCliBco
sheetdest.getRange("C58").setValue(datasheet.getRange(blankRow,16).getValue());//TxCambioCli
sheetdest.getRange("C43").setValue(datasheet.getRange(blankRow,17).getValue());//IOFBco
sheetdest.getRange("C59").setValue(datasheet.getRange(blankRow,17).getValue());//IOFCli
sheetdest.getRange("C44").setValue(datasheet.getRange(blankRow,26).getValue());//IOFValorBco
sheetdest.getRange("C60").setValue(datasheet.getRange(blankRow,26).getValue());//IOFValorCli
sheetdest.getRange("C45").setValue(datasheet.getRange(blankRow,18).getValue());//TarifaBco
sheetdest.getRange("C61").setValue(datasheet.getRange(blankRow,18).getValue());//TarifaCli
sheetdest.getRange("C46").setValue(datasheet.getRange(blankRow,27).getValue());//IRValorBco
sheetdest.getRange("C62").setValue(datasheet.getRange(blankRow,27).getValue());//IRValorCli
sheetdest.getRange("C47").setValue(datasheet.getRange(blankRow,28).getValue());//ValorBRLBco
sheetdest.getRange("C63").setValue(datasheet.getRange(blankRow,28).getValue());//ValorBRLCli
sheetdest.getRange("C48").setValue(datasheet.getRange(blankRow,3).getValue());//ValutaBRLBco
sheetdest.getRange("C64").setValue(datasheet.getRange(blankRow,3).getValue());//ValutaBRLCli
sheetdest.getRange("C49").setValue(datasheet.getRange(blankRow,4).getValue());//ValutaMEBco
sheetdest.getRange("C65").setValue(datasheet.getRange(blankRow,4).getValue());//ValutaMECli
}
我相信你的目标如下。
- 您想减少脚本的处理成本。
在这种情况下,我想建议使用表格API。当Sheets API用于你的脚本时,它变成如下。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function buildTables2() {
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var datasheet = myGoogleSheet.getSheetByName("Boletador (Dados)");
var columnToCheck = datasheet.getRange("A:A").getValues();
function getLastRowSpecial(range) {
var rowNum = 0;
var blank = false;
for (var row = 0; row < range.length; row++)
if (range[row][0] === "" && !blank) {
rowNum = row;
blank = true;
} else if (range[row][0] !== "") {
blank = false;
};
return rowNum;
};
var blankRow = getLastRowSpecial(columnToCheck);
var src = ["J", "J", "I", "I", "K", "K", "L", "L", "N", "N", "O", "P", "P", "Q", "Q", "Z", "Z", "R", "R", "AA", "AA", "AB", "AB", "C", "C", "D", "D"].map(e => `'Boletador (Dados)'!${e + blankRow}`);
var dst = ["C36", "C53", "C37", "C54", "C38", "C55", "C39", "C56", "C40", "C57", "C41", "C42", "C58", "C43", "C59", "C44", "C60", "C45", "C61", "C46", "C62", "C47", "C63", "C48", "C64", "C49", "C65"].map(e => `'Interface Boletagem'!${e}`);
var ssId = myGoogleSheet.getId();
var values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: src }).valueRanges.map(({ values }) => values ? values[0][0] : "");
var data = values.map((e, i) => ({ values: [[e]], range: dst[i] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ssId);
}