Google Apps Script (GAS)で文書作成をどれだけ効率化できるか挑戦 Part3 ~条件分岐による集計~

加藤です。もう12月とか信じられないです。

シリーズPart3です。前回はこちら。 tech.arms-soft.co.jp

またもや例がテスト項目表なのですが、

  • 結果の◯,×で集計ができたらいいかも?
  • 日付ごとに消化率を計算できるようになったら、進捗がわかりやすい?

と色々思いつく状況がありましたので、今回は条件分岐に挑戦しようと思います。

とりあえず今回のゴールは結果の◯,×で集計です。

(1)関数作成

スクリプトエディタを開いて、自作の関数 ifByResult() を追加しました。

function ifByResult() {
  try{
    // (1)現在開いているスプレッドシートのオブジェクト選択
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    
    // (2)現在開いているシートの選択
    var sheet = spreadsheet.getActiveSheet();
    
    // (3)シートの最後の行までを取得
    var lastRow = sheet.getLastRow();
    
    // (4)メッセージ生成
    var maru_message = "";
    var maru_count = 0;
    var batu_message = "";
    var batu_count = 0;
    
    for(var i = 2; i <= lastRow; i++) {
      
      if(sheet.getRange(i, 4).getValue()=='○'){
        
        maru_message += i+"行目"+ "\\n";
        maru_count++;
        
      }else if(sheet.getRange(i, 4).getValue()=='×'){
        
        batu_message += i+"行目: No"+ sheet.getRange(i, 1).getValue() +': '+ sheet.getRange(i, 2).getValue() +"\\n";
        batu_count++;
      }
    }
    
    // (5)表示
    Browser.msgBox("○:" + maru_count + "\\n" + maru_message + "\\n" + "×:" + batu_count + "\\n" + batu_message);
    
  }catch(e){
    Browser.msgBox(e);
  }
}

関数名のネーミングセンスに関しては、個人の学習も兼ねているので目をつぶっていただければ幸いです(汗)

複数人で作業をするような開発だと特に『名前をぱっと見て、どんな機能を持った関数か・どんな処理をする関数かがわかるように』を意識したいものですが…。

脱線しました、話を戻します。

ポイントは以下のとおりです。

1.シート内の最終行までを取得

getLastRow()を使うと、そのシート内の最終行までを取得することができます。

2.範囲指定

前回も使った getRange() を使っていますが、範囲指定の方法を変えてみました。

前回はシート名と取得したい範囲を文字列で指定したのですが、今回は引数に数字を指定してgetRange(開始行, 開始列) という取り方をしました。

加藤はここでちょっと引っかかりました…。 getLastRow()もgetRange()も、シートに対して取得をするメソッドなので、 getActiveSpreadsheet()でスプレッドシートを取得したあと、さらにgetActiveSheet()でアクティブなシートまで指定するのを忘れるとエラーになります。

(前回はシート名も一緒に引数指定していたので大丈夫でした)

冷静に考えれば、ちゃんとパラメータ指定してやらなければどこを参照すればいいのかわからなくなるのは当たり前なのですが…。

(2)実行

実行結果はこんな感じです。

(3)おまけ・追加メニュー

おまけを。スプレッドシートに対してaddMenu()とすると、メニューバーに自作メニューを追加してくれるようなのでこちらも試してみました。

スクリプトエディタを開いて、ファイルを開くときのイベントハンドラ onOpen(event) を作成し、

今回作成した集計用の関数をセットしてメニューを追加してみます。

function onOpen(event){

  var menuitems = [
    // 自作関数をセット
    {name:’集計’, functionName:'ifByResult'},
  ];

  // 今開いているスプレッドシートに、メニューを追加する
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheet.addMenu('追加メニュー', menuitems);
}

スプレッドシートを開きなおすとご覧のようにメニューが追加されていました。

…初回でやった、ボタン描写してスクリプト割り当ての方が操作がワンクリックなので、そっちの方がラクかもしれない。(元も子もない)

イベントハンドラもいろいろ用意されているようなので、活かせるように勉強したいです。

今回は以上です。