我正在構建一個包含兩個主要作業表的 Google 表格:(i) 包含資料的用戶界面(名稱:“Interface Boletagem” - 我們稱之為作業表 A)和 (ii) 存盤資料的資料庫(名稱:“Boletador (Dados)”——我們稱之為表 B)。
感謝這個論壇的貢獻者,我已經有了一個優化的腳本,它將資料從作業表 A 傳輸到作業表 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');
}
將資料存盤在作業表 B 上后,進行一些計算,我需要使用作業表 B 中新創建的行中的資料填充作業表 A 下的兩個匯總表。現在我有一個功能腳本(如下),但是運行需要很長時間。關于如何優化它的任何提示?
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
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低腳本的處理成本。
在這種情況下,我想建議使用 Sheets API。當 Sheets API 用于您的腳本時,它變為如下。
修改后的腳本:
在使用此腳本之前,請在 Advanced Google services 中啟用 Sheets API。
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);
}
參考:
- 方法:電子表格.values.batchGet
- 方法:電子表格.values.batchUpdate
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441625.html
