ray88’s diary

お仕事で困ったとき用の自分用の覚書

GAS VBAのWithブロックはGASでどう書く? メソッドチェーンでスマートに!

GAS 目次 - ray88’s diary
各種目次 - ray88’s diary
Withブロック代替記法→ メソッドチェーンでスマートに!
VBAユーザーがGASに移行するときのつまずきポイント
VBAからGoogle Apps Script(GAS)への移行では、よく使われる構文がGASに存在しないため、戸惑うことも多いですよね。特に「Withブロック」がその代表格です。この記事では、VBAのWithブロックをGASでどう書き換えるか、具体例とともにご紹介します。

VBAのWithブロックとは?
まず、VBAでのWithブロックの基本形を確認しておきましょう。

With Range("A1")
    .Value = "Hello"
    .Font.Bold = True
    .Interior.Color = RGB(255, 255, 0)
End With

この構文では「Range("A1")」を毎回書かずに、対象に対して複数のプロパティやメソッドを設定できます。

GASでの代替方法:主に3つの書き方
GASには「Withブロック」は存在しませんが、代わりにメソッドチェーンや一時変数を使って同じようなことができます。

方法1:変数に一度代入(最も一般的)

const range = SpreadsheetApp.getActiveSheet().getRange("A1");
range.setValue("Hello");
range.setFontWeight("bold");
range.setBackground("#FFFF00");

方法2:メソッドチェーンでスマートに(推奨)

SpreadsheetApp.getActiveSheet()
  .getRange("A1")
  .setValue("Hello")
  .setFontWeight("bold")
  .setBackground("#FFFF00");

方法3:一括設定でまとめて処理

const range = SpreadsheetApp.getActiveSheet().getRange("A1");
range.setValue("Hello");
range.setFontWeights([["bold"]]);
range.setBackgrounds([["#FFFF00"]]);

メソッドチェーンの基本原理を理解しよう
GASでは、オブジェクトを返すメソッドが連続して呼び出せる仕組みがあります。これがメソッドチェーンです。

const LastRow = sheet
  .getRange(sheet.getMaxRows(), column_num)     // Rangeオブジェクトを返す
  .getNextDataCell(SpreadsheetApp.Direction.UP) // 次のデータセル(上方向)を探す
  .getRow();                                     // 対象セルの行番号を取得

初心者向けの丁寧なコメント付き例

const LastRow = sheet
  .getRange(sheet.getMaxRows(), column_num)           // まずRangeを取得
  .getNextDataCell(SpreadsheetApp.Direction.UP)       // 上方向にデータセルを探す
  .getRow();                                           // そのセルの行番号を取得

まとめ:Withブロックがなくても怖くない!
GASでは、Withブロックに相当する書き方として「変数への代入」「メソッドチェーン」「一括設定」の3パターンがあり、いずれも直感的で読みやすくなっています。特にメソッドチェーンはコードをスッキリと書けるため、ぜひ活用してみてください。