在單個 Google Sheets 作業表中,我有一個用戶輸入表,該表被安排為適合不喜歡電子表格的人使用,因此標簽中散布著資料,還有一個用于記錄保存的分類帳表。輸入表具有以用戶為中心的計算單元和以記錄為中心的單元的組合。我正在嘗試創建一個腳本(從作業表上的一個按鈕運行,該按鈕已經作業),它將以記錄為中心的單元格的當前內容復制到分類帳表,然后重置所有輸入單元格以供下次使用。我將需要腳本來處理輸入表的多個副本,并且我希望它在使用時不會明顯地跳轉到記錄表,但這是可選的。
到目前為止,我已經將我的腳本與宏錄制和許多其他答案拼湊在一起;我不拘泥于當前的任何代碼,但輸入和輸出表需要保持原樣。但是,我確實有一個計算膽量表,可用于保存我當前代碼中的一些常量值。我已經看到了一些類似問題的解決方案,這些解決方案采用了從電子表格本身復制哪些單元格的定義,但我并不太擔心。
編輯:好的,我對代碼進行了相當大的清理,它目前可以滿足我的需要,只是效率低下。
function MakeMasterLogRecord() {
var spreadsheet = SpreadsheetApp.getActive();
var sourcesheet = SpreadsheetApp.getActiveSheet();
const masterlog = spreadsheet.getSheetByName('Master Log');
var firstemptyrow = masterlog.getLastRow() 1;
var currentcolumn = 1
var targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
var sourcecells = ['Z12','C2','N2','C10','F2','C4','E4','C5','E5','L5','L4','Z13','T4','T5','C6'];
sourcesheet.getRange('Z12').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C2').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('N2').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C10').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('F2').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('E4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('E5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('L5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('L4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('Z13').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('T4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('T5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C6').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn ;
};
變數“sourcecells”是包含我要復制的資訊的單元格串列,我希望能夠將其用作回圈的輸入,而不必直接呼叫串列中的每個值。當前未使用。
再次編輯:
使用 Kessy 建議的 getValue 和 setValue,以及 Cooper 建議的 forEach 回圈。
這個“有效”的原因在于它運行正確的次數,盡管使用相同的資料,并且它比我剛剛手動布置單元格參考的版本慢得多。
function MakeMasterLogRecord() {
var spreadsheet = SpreadsheetApp.getActive();
var sourcesheet = SpreadsheetApp.getActiveSheet();
const masterlog = spreadsheet.getSheetByName('Master Log');
var firstemptyrow = masterlog.getLastRow() 1;
var currentcolumn = 1
var targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
const sourcecell = ['\'Z12\'','\'C2\'','\'N2\'','\'C10\'','\'F2\'','\'C4\'','\'E4\'','\'C5\'','\'E5\'','\'L5\'','\'L4\'','\'Z13\'','\'T4\'','\'T5\'','\'C6\''];
for (const element of sourcecell) {
var targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
targetcell.setValue(sourcesheet.getRange('Z12').getValue());
currentcolumn ;
};
};
我已經嘗試了帶和不帶轉義引號的陣列條目,但都導致 Range Not Found 錯誤。我無法讓轉義引號在“sourcecell”變數周圍正常作業,所以我不知道如果我這樣做是否會起作用。它始終認為“sourcecell”一詞在引號內。
uj5u.com熱心網友回復:
試試這個來提高性能一點:
function submitData() {
const ss = SpreadsheetApp.getActive();
const formRangeList = ss.getActiveSheet()
.getRangeList(['Z12', 'C2', 'N2', 'C10', 'F2', 'C4', 'E4', 'C5', 'E5', 'L5', 'L4', 'Z13', 'T4', 'T5', 'C6']);
ss.getSheetByName('Master Log')
.appendRow(formRangeList.getRanges().map(range => range.getValue()));
formRangeList.clearContent(); // remove this line if you do not want to clear the "form"
}
這仍然遠非最佳,因為它呼叫了Range.getValue()
15 次。要將運行時性能提高十倍,.getRange('A1:Z13').getValues()
請使用 一次性獲取所有資料,然后使用陣列索引提取所需的值并附加到目標作業表,如下所示:
function submitDataOhSoMuchFaster() {
const ss = SpreadsheetApp.getActive();
const values = ss.getActiveSheet().getRange('A1:Z13').getValues();
const spec = [
{ column: 26, row: 12 }, // Z12
{ column: 3, row: 2 }, // C2
{ column: 14, row: 2 }, // N2
// ...
];
ss.getSheetByName('Master Log')
.appendRow(spec.map(cell => values[cell.row - 1][cell.column - 1]));
}
請參閱Apps 腳本最佳做法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/468834.html