こんにちは! 健史です。
以下の記事のGAS版です。
コンロトールブレイク キーブレイクのロジックを徹底解説!VBAで確認
コントロールブレイク・キーブレイク処理をこれから作成する、作成中だけど正確に動かない、作成したけど正確性を確認したいなど思われている方へ、チェックポイントを含め詳細を紐解いて解説します。基本中の基本であるロジックをマスターしちゃいましょう!
処理概要
シート1のA列:日付ごとにB列:数を集計し、シート2に出力します。
シート1
シート2
プログラム
//------------------------------ // コントロールブレイク //------------------------------ function myfunc1(){ var ss = SpreadsheetApp.getActiveSpreadsheet() var sheet1 = ss.getSheets()[0] var sheet2 = ss.getSheets()[1] // 変数定義 var ix1,iy2,ix1_max var sav_date ,wk_kingaku // 最大行、最大桁を取得 ix1_max = sheet1.getLastRow() // 出力ファイルのオープン sheet2.clear() ix2 = 0 // 入力データの読み込み ix1 = 1 // ループ処理 while (ix1 <= ix1_max) { // 初期処理 wk_kingaku = 0 sav_date = dateconv(sheet1.getRange(ix1,1).getValue()) // 集計処理 「データが無くなるまで、又は、日付が等しくなくなるまで」 の否定 while (ix1 <= ix1_max && sav_date == dateconv(sheet1.getRange(ix1,1).getValue())) { wk_kingaku = wk_kingaku + sheet1.getRange(ix1,2).getValue() ix1++ //次のデータ読み込み } // ブレイク後の処理 ix2++ sheet2.getRange(ix2,1).setValue(sav_date) sheet2.getRange(ix2,2).setValue(wk_kingaku) } } //------------------------------ // 日付のみを取得 //------------------------------ function dateconv(indate) { var outdate = Utilities.formatDate(indate, 'JST', 'yyyy/MM/dd') return outdate }
補足
・GASにUntilはない
ループ処理の判断において、GASには「until」がありません。
なのでuntil型に慣れている方は、until条件の否定形にしてwhile条件を記述しなければなりません。
・日付型のデータは変換が必要だった
VBAの記事で使用した日付データは先頭に[']がついた文字タイプのデータを処理しています。
今回スプレッドシートでは、敢えて日付型データとして設定し、処理しました。
ですが、日付データを退避・比較するための項目[sav_date]に、セルの日付型データを退避しても比較処理で正常に処理されませんでした。
セルの日付型データとは異なる値になり等しくならず、ループ処理の中に入りません。
仕方なく[Utilities.formatDate~]で日付部分だけを取り出して処理することにしました。
メインの処理の中に記述したのですが、1行が長くなるため「日付のみを取得」するファンクションを作成しています。
最後に
スプレッドシートにおいてもピボットテーブルの機能があるので、プログラムを作成する必要はないかもしれません。
ですが、プログラムで「データを順次処理する」ことが必要になった際に、ひな形として参考にして頂ければと思います。
ご活用頂ければと思います。
コメント