要擴大GEOWill的答案,您正在處理數組。 GAS(和JavaScript)不會自動循環遍歷包含2D的數組,而無需告訴它。 GAS(Javascript)方法被設計爲在數組上作爲整體或在數組中的單個對象上運行;不是都。您的錯誤來自嘗試使用陣列上的對象方法。
如果您要使用方法.getSheets()
,您將擁有一個包含所有表單名稱的數組。這是您循環時可以在每個元素上執行方法的對象數組。我已經包含了幾種替代方法來循環每個需要操作的表單。
第一個是,如果需要執行的代碼的紙張是第6:
function phaseFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < 6; i++) {
var sheet = ss.getSheetByName(sheets[i]);
//further variable definition as usual
//we are now working with a singular sheet object (sheets[i])
//code to perform
}
}
這類似於GEOWill的戰略,但將永遠做第一6.如果你想改變這可能是有用的,其使用表,並知道它將永遠是特別是第一個6.
下面的結構操作GEOWill的如何根據名稱選擇工作表。如果使用相同的工作表並且名稱不會更改,這很有用。
function phaseFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ['Phase 1','Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6'];
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
//further variable definition as usual
//code to perform
}
}
下一個構造循環遍歷所有工作表,無論順序如何,並在名稱匹配時執行代碼。
function phaseFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
if (sheet == "Name 1" || sheet == "Name 2" || ...) {
//further variable definition as usual
//the variables defined will only be defined on the desired sheets
//code to perform
} else {
continue;
//skip over all those that don't meet the condition
}
}
}
如果你將永遠有9張(或更少張說不滿足比做的條件),你可以改變if()
語句來檢查的那些跳過。這樣可以縮短條件語句,並允許添加更多要處理的工作表,使其始終保持獨立,不受干擾。
最後兩個結構將涉及標準的命名約定。你的問題意味着你的名單如何標準化,以及如果單獨留下的表單不符合這個標準,你可以使用我在下面寫的內容。它檢查名稱以查看它是否與您設置的約定類似,如果是,則執行代碼。例如,如果它以「階段」開頭,則執行代碼,如果沒有(「數據」,「日誌」,「公式」等),則不要執行代碼。
這第一個使用一個基本的字符串方法.includes()
:
function phaseFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
var name = sheet.getName();
if (name.includes("Phase")) { //this returns a boolean
//further variable definition as usual
//the variables defined will only be defined on the desired sheets
//code to perform
} else {
continue;
//skip over all those that don't meet the condition
}
}
}
下面使用正則表達式。
function phaseFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
var sheetName = sheet.getName();
var nameMatch = sheetName.match(/\b\Phase\b/g);
if (nameMatch[0] != null) {
//further variable definition as usual
//the variables defined will only be defined on the desired sheets
//code to perform
} else {
continue;
//skip over all those that don't meet the condition
}
}
}
這個特定的RegEx尋找短語「Phase」;區分大小寫。然後檢查由.match()
返回的數組,如果它不爲空,則執行代碼。有幾百種方法可以進行這種匹配和檢查過程。 RegEx的參考和指南(非常有用)可參見here和here。測試人員可以在here找到。