Service Object Mastery

文法編2:各アプリの階層と記述法

GASのコードは「誰に対して」「どの階層をたどって」「何をするか」を記述します。
各アプリの構造を理解すると、コードを丸暗記しなくても自力で組み立てやすくなります。

まずは「階層」の考え方をつかむ

GASのコードは、いきなり「セルを書き換える」「メールを送る」と書いているように見えて、 実際にはその前に「どのアプリの」「どの対象を」操作しているかを順番にたどっています。

たとえば SpreadsheetApp なら、まずスプレッドシート全体があり、その中にシートがあり、その中にセル範囲があります。 DriveApp なら、Drive 全体の中にフォルダがあり、その中にファイルがあります。

このページで意識したいこと

  • どのサービスを操作しているのか
  • そのサービスの中で、どの階層をたどっているのか
  • 最後に、どんな命令を実行しているのか

丸暗記しなくてよい理由

GASの各サービスは違って見えても、考え方は共通しています。 「大元のアプリ → 対象 → さらに対象 → 操作」という順番さえ理解していれば、 初めて見るコードでも意味を追いやすくなります。

1. SpreadsheetApp

司令部 (SpreadsheetApp) ➔ ファイル (Spreadsheet) ➔ シート (Sheet) ➔ 範囲 (Range)

スプレッドシート操作は、GAS学習の中心です。 ただし、GASは最初からセルを直接扱うわけではなく、 まずスプレッドシート全体、その中のシート、その中の範囲という順番で対象を絞っていきます。

記述ルール:データの読み書き

値を取得する際は、最後に getValue()getValues() が必要です。Range(範囲)を指定しただけでは、まだデータは取り出せていません。

他に何ができる?

  • 一括消去: range.clearContent() でデータのみ削除
  • 条件付書式: 特定の数値を超えたら自動で赤くする
  • PDF出力: シートの内容をPDF化して保存する
// A1〜C10のデータを一気にとってくる書き方
const data = sheet.getRange("A1:C10").getValues();

// 2行目の3列目(C2)に書き込む書き方
sheet.getRange(2, 3).setValue("完了");

なぜ階層が必要なのか

SpreadsheetApp だけでは「どのファイルの、どのシートの、どのセルか」が分かりません。 そのため、対象を順番に絞り込んでいく必要があります。

初心者がつまずきやすい点

  • getRange() しただけでは値は取れていません。
  • getValue() は1セル、getValues() は複数セルです。
  • 行列指定は 1 始まりで、配列の 0 始まりと混同しやすいです。

2. GmailApp

司令部 (GmailApp) ➔ スレッド (Thread) ➔ メッセージ (Message)

Gmailは、1通ずつ完全に独立しているように見えて、 実際には「会話のまとまり」であるスレッド単位で整理されています。 そのため、読む時もラベルを付ける時も、スレッドを意識する場面が多くあります。

記述ルール:スレッドとメッセージ

Gmailは返信などが重なる「スレッド」単位で動きます。中身を読む時は、スレッドの中から特定の「メッセージ」を取り出す必要があります。

他に何ができる?

  • 検索: search("is:unread") で未読のみ抽出
  • ラベル: thread.addLabel(label) で自動仕分け
  • 添付保存: 届いた請求書のPDFを自動でDriveへ保存
// 送信の基本(宛先, 件名, 本文)
GmailApp.sendEmail("to@ex.com", "件名", "本文");

// 下書き作成(安全なテスト用)
GmailApp.createDraft("to@ex.com", "下書き", "確認中");

Gmailで特に大事な視点

Gmailは「読む」「探す」「送る」「仕分ける」が主な操作です。 その中でも送信は影響が大きいため、最初は createDraft で下書きを作る方法から慣れると安全です。

実務での注意

  • いきなり送信すると誤送信リスクがあります。
  • 検索条件が広すぎると、意図しないメールまで処理対象になります。
  • スレッド単位なのかメッセージ単位なのかを意識しないと、想定と違う動きになります。

3. DriveApp

司令部 (DriveApp) ➔ フォルダ (Folder) ➔ ファイル (File)

Drive操作では、「どこにあるか」が特に重要です。 同じ名前のファイルやフォルダが複数存在することがあるため、 実務では名前よりも ID を使って対象を特定する方が確実です。

記述ルール:IDによる指定

ファイルやフォルダを特定する際は、名前ではなく「ID」を使うのが最も確実な記述法です。

他に何ができる?

  • コピー: 雛形をコピーして新規案件ファイルを作る
  • 権限管理: 外部パートナーへの共有を自動で付与
  • ゴミ箱: 1年以上前のファイルを自動で整理
// IDでフォルダを捕まえる
const folder = DriveApp.getFolderById("ID文字列");

// その中にファイルを作る
folder.createFile("2026_memo.txt", "内容");

Driveでよくある考え方

まずフォルダを取得し、その中でファイルを作る・探す・コピーするという流れが基本です。 「保存先をまず決める」という感覚で考えると分かりやすくなります。

初心者がつまずきやすい点

  • 名前指定だけだと、同名フォルダ・同名ファイルで混乱しやすいです。
  • createFile は「その場に新しく作る」処理なので、重複作成に注意が必要です。
  • 権限のない場所や共有状況によっては、想定通り操作できないことがあります。

4. CalendarApp

司令部 (CalendarApp) ➔ カレンダー (Calendar) ➔ 予定 (Event)

Calendarでは、「どのカレンダーの」「どの期間の予定か」を指定する考え方が重要です。 スプレッドシートが場所を意識するのに対して、 カレンダーは時間範囲を意識するサービスだと考えると理解しやすくなります。

記述ルール:期間の指定

予定を取得する際は「いつからいつまで」という開始時刻と終了時刻(Dateオブジェクト)を渡すのが必須ルールです。

他に何ができる?

  • 色分け: 重要な会議を自動で「赤色」にする
  • ゲスト招待: 予定作成時にメンバーを自動招待
  • 削除: キャンセルされた予定を一括で消去
// 今日の全予定を取得する書き方
const today = new Date();
const events = CalendarApp.getEventsForDay(today);

// タイトル、開始、終了を指定して作成
CalendarApp.createEvent("MTG", startTime, endTime);

Calendarで意識すべきこと

予定は1件だけ扱うより、複数件をまとめて取得して一覧化することが多いです。 そのため Date オブジェクトと配列の組み合わせがよく登場します。

初心者がつまずきやすい点

  • 時間範囲を間違えると、予定が取れない・余計に取れることがあります。
  • getEventsForDay と getEvents は似ていますが、指定方法が異なります。
  • 作成系の処理は重複実行すると、同じ予定が何件もできることがあります。

5. DocumentApp

司令部 (DocumentApp) ➔ ドキュメント (Document) ➔ 本文 (Body) ➔ 要素 (Paragraph/Table)

DocumentApp では、ドキュメント本体と本文が分かれています。 そのため、ただドキュメントを開いただけでは文字を書き込めず、 本文に対して段落や表を追加する必要があります。

記述ルール:Bodyの取得

ドキュメントを編集するには、まず getBody() で「本文」という階層にアクセスする必要があります。これを忘れると文字を書き込めません。

他に何ができる?

  • 一括置換: 契約書の「社名」部分をすべて書き換える
  • 表作成: スプレッドシートの結果をドキュメントの表に挿入
  • 書式: 特定の単語だけを赤色・太字にする
// 本文(Body)を取得してから操作する
const body = DocumentApp.getActiveDocument().getBody();

// 本文内のテキストを置換する強力な命令
body.replaceText("{name}", "田中様");

Documentでよくある使い方

実務では、議事録作成、案内文作成、契約書雛形への差し込みなどで使われます。 特に replaceText は、テンプレート運用と相性の良い命令です。

初心者がつまずきやすい点

  • Document を取っただけでは編集できず、Body を取る必要があります。
  • 本文内のどこに何があるかを意識しないと、想定外の文字列まで置換してしまうことがあります。
  • テンプレート活用では、置換対象の表記ゆれを防ぐことが重要です。

6. 各サービスに共通する書き方の型

サービスごとに命令は違っても、書き方の型はかなり共通しています。 次のパターンで読むと、初見のコードでも理解しやすくなります。

大元のアプリを指定する
→ 対象を取得する
→ さらに対象を絞る
→ 最後に操作する

SpreadsheetApp

SpreadsheetApp → Sheet → Range → getValue / setValue

GmailApp

GmailApp → Thread / Message → 読む / 送る / ラベル付け

DriveApp

DriveApp → Folder → File → 作成 / コピー / 取得

DocumentApp / CalendarApp

Document / Calendar → 中身 → 追加 / 取得 / 更新

ここが理解できると強い

サービスごとの命令を一字一句覚えなくても、 「大元から順にたどって最後に操作する」という型が分かっていれば、 公式ドキュメントやAIの提案コードも読み解きやすくなります。

文法編2 のまとめ

GASでは、各アプリを「階層」で理解すると、コードの意味が一気に見えやすくなります。
どのサービスでも、「誰を操作しているか」「その下の何を触っているか」を追えるようになることが重要です。

・Spreadsheet は「場所」をたどる

・Calendar は「時間」をたどる

・Drive は「保存先」をたどる

・Document は「本文」をたどる

・Gmail は「会話のまとまり」を意識する

前のステップへ(文法編1) 次のステップへ(AI開発編)