GAS

GAS コントロールブレイク処理

GAS

こんにちは! 健史です。

以下の記事の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行が長くなるため「日付のみを取得」するファンクションを作成しています。

最後に

スプレッドシートにおいてもピボットテーブルの機能があるので、プログラムを作成する必要はないかもしれません。

ですが、プログラムで「データを順次処理する」ことが必要になった際に、ひな形として参考にして頂ければと思います。


ご活用頂ければと思います。

GAS
スポンサーリンク
- 面白かったらシェアお願いします! -
健史をフォローする
自分で改善

コメント