2016-08-26 89 views
0

我的電子表格中有9個標籤,並且希望將排序腳本僅應用於這些標籤中的6個。我無法弄清楚如何做到這一點。Google表格腳本 - 應用於表格中的特定標籤

///////Auto Sort Phase Sheets 
    //get sheet 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ['Phase 1','Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6']; 
    //get active cell 
    var editedCell = sheet.getActiveCell(); 
    //get range 
    var range = sheet.getRange("A2:Z"); 
    //sort by: status, priority, estimated time 
    range.sort([{column: 2, ascending: true}, {column: 1, ascending: true}, {column:3}]); 

我得到這個錯誤:類型錯誤:在對象1期,2期,3期,4期,5期,第6期

找不到功能getActiveCell當我刪除 'getActiveCell' 我得到這個錯誤:TypeError:在對象階段1,階段2,階段3,階段4,階段5,階段6中找不到函數getRange。

當我刪除'getRange'時,腳本沒有任何操作。

回答

1

我認爲主要問題是您需要循環訪問您的'表'數組中指定的表名稱列表。除此之外,則共享的代碼應該嵌入的功能,以便被運行(順便說一下,我除去editedCell變量,因爲它是多餘的):

///////Auto Sort Phase Sheets 
 
function sortSheets(){ 
 
    //get sheet 
 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
 
    //Specify sheets to be sorted 
 
    var sheet_name = ['Phase 1','Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6']; 
 
    for (s=0; s<sheet_name.length; s++) { 
 
    var sheet = ss.getSheetByName(sheet_name[s]); 
 
    //get range 
 
    var range = sheet.getRange("A2:Z"); 
 
    //sort by: status, priority, estimated time 
 
    range.sort([{column: 2, ascending: true}, {column: 1, ascending: true}, {column:3}]); 
 
    } 
 
}

這裏是我測試過的工作表: https://docs.google.com/spreadsheets/d/1VyhzrYwOWgGWszrRoUrQU2ECGqwN_lfb99fqw7x9P1k/edit#gid=0

0

要擴大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的參考和指南(非常有用)可參見herehere。測試人員可以在here找到。

相關問題