こんにちは! 健史です。
以下の記事の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行が長くなるため「日付のみを取得」するファンクションを作成しています。
最後に
スプレッドシートにおいてもピボットテーブルの機能があるので、プログラムを作成する必要はないかもしれません。
ですが、プログラムで「データを順次処理する」ことが必要になった際に、ひな形として参考にして頂ければと思います。
ご活用頂ければと思います。



コメント