2016-08-26 4 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}]); 

私はこのエラーを取得する:例外TypeError:私は 'getActiveCell' を削除すると、オブジェクトフェーズ1、フェーズ2、フェーズ3、フェーズ4、フェーズ5、フェーズ6

に機能getActiveCellを見つけることができません、私はこれを取得エラー:TypeError:オブジェクトフェーズ1、フェーズ2、フェーズ3、フェーズ4、フェーズ5、フェーズ6で関数getRangeが見つかりません。

「getRange」を削除すると、スクリプトは何もしません。

答えて

1

私は主な問題は、あなたの 'シート'配列に与えられたシート名の指定されたリストをループする必要があったと思います。ここで

///////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}]); 
 
    } 
 
}

:それに加えて、あなたは共有コードが実行されるために、機能に埋め込まれるべき(それは冗長であるので仕方によって、私はeditedCell変数を削除しました)私がテストしたシートです: https://docs.google.com/spreadsheets/d/1VyhzrYwOWgGWszrRoUrQU2ECGqwN_lfb99fqw7x9P1k/edit#gid=0

0

GEOWillの答えで展開するには、配列を使って作業しています。 GAS(およびJavaScript)は、あなたに指示することなく、配列を自動的にループすることはありません。 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を行います。これは有用である可能性がありますシートが使用され、常に、具体的には第1の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 
    } 
} 

次の構成は、順序に関係なくすべてのシートをループし、名前が一致するとコードを実行します。あなたはいつも(が何よりも条件を満たしていないことを以下枚)9枚を持っています場合

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 
    } 
    } 
} 

あなたはスキップするものをチェックするためにif()文を変更することができます。これは条件文を短くし、処理したいシートを追加し、常にシートを1枚だけ放置したままにします。

この最後の2つの構成には、標準的な命名規則が含まれます。あなたの質問は、あなたのシートに名前を付ける方法の標準化があることを暗示しています。そして、シートを単独で放置することがこの基準に合致しない場合、あなたは以下に書いたものを使用することができます。名前をチェックして、設定した規約に似ているかどうかを確認し、そうであればコードを実行します。たとえば、 "Phase"で始まる場合はコードを実行し、そうでなければ( "Data"、 "Log"、 "Formulas"など)、コードを実行しないでください。

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 
    } 
    } 
} 

以下は正規表現を使用しています。

この最初のものは、基本的な文字列メソッド.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 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 
    } 
    } 
} 

この特定の正規表現は、「フェーズ」というフレーズを検索します。大文字と小文字を区別。 .match()によって返された配列をチェックし、ヌルでない場合はコードを実行します。このマッチングとチェックのプロセスについては、何百もの方法があります。 RegEx(非常に有用)に関する参考文献およびガイドは、hereおよびhereで見つけることができます。テスターはhereです。

関連する問題