文法編2:各アプリの階層と記述法
GASのコードは「誰に対して」「どの階層をたどって」「何をするか」を記述します。
各アプリの構造を理解すると、コードを丸暗記しなくても自力で組み立てやすくなります。
まずは「階層」の考え方をつかむ
GASのコードは、いきなり「セルを書き換える」「メールを送る」と書いているように見えて、 実際にはその前に「どのアプリの」「どの対象を」操作しているかを順番にたどっています。
たとえば SpreadsheetApp なら、まずスプレッドシート全体があり、その中にシートがあり、その中にセル範囲があります。 DriveApp なら、Drive 全体の中にフォルダがあり、その中にファイルがあります。
このページで意識したいこと
- どのサービスを操作しているのか
- そのサービスの中で、どの階層をたどっているのか
- 最後に、どんな命令を実行しているのか
丸暗記しなくてよい理由
GASの各サービスは違って見えても、考え方は共通しています。 「大元のアプリ → 対象 → さらに対象 → 操作」という順番さえ理解していれば、 初めて見るコードでも意味を追いやすくなります。
1. SpreadsheetApp
スプレッドシート操作は、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
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
Drive操作では、「どこにあるか」が特に重要です。 同じ名前のファイルやフォルダが複数存在することがあるため、 実務では名前よりも ID を使って対象を特定する方が確実です。
ファイルやフォルダを特定する際は、名前ではなく「ID」を使うのが最も確実な記述法です。
他に何ができる?
- コピー: 雛形をコピーして新規案件ファイルを作る
- 権限管理: 外部パートナーへの共有を自動で付与
- ゴミ箱: 1年以上前のファイルを自動で整理
// IDでフォルダを捕まえる const folder = DriveApp.getFolderById("ID文字列"); // その中にファイルを作る folder.createFile("2026_memo.txt", "内容");
Driveでよくある考え方
まずフォルダを取得し、その中でファイルを作る・探す・コピーするという流れが基本です。 「保存先をまず決める」という感覚で考えると分かりやすくなります。
初心者がつまずきやすい点
- 名前指定だけだと、同名フォルダ・同名ファイルで混乱しやすいです。
- createFile は「その場に新しく作る」処理なので、重複作成に注意が必要です。
- 権限のない場所や共有状況によっては、想定通り操作できないことがあります。
4. CalendarApp
Calendarでは、「どのカレンダーの」「どの期間の予定か」を指定する考え方が重要です。 スプレッドシートが場所を意識するのに対して、 カレンダーは時間範囲を意識するサービスだと考えると理解しやすくなります。
予定を取得する際は「いつからいつまで」という開始時刻と終了時刻(Dateオブジェクト)を渡すのが必須ルールです。
他に何ができる?
- 色分け: 重要な会議を自動で「赤色」にする
- ゲスト招待: 予定作成時にメンバーを自動招待
- 削除: キャンセルされた予定を一括で消去
// 今日の全予定を取得する書き方 const today = new Date(); const events = CalendarApp.getEventsForDay(today); // タイトル、開始、終了を指定して作成 CalendarApp.createEvent("MTG", startTime, endTime);
Calendarで意識すべきこと
予定は1件だけ扱うより、複数件をまとめて取得して一覧化することが多いです。 そのため Date オブジェクトと配列の組み合わせがよく登場します。
初心者がつまずきやすい点
- 時間範囲を間違えると、予定が取れない・余計に取れることがあります。
- getEventsForDay と getEvents は似ていますが、指定方法が異なります。
- 作成系の処理は重複実行すると、同じ予定が何件もできることがあります。
5. DocumentApp
DocumentApp では、ドキュメント本体と本文が分かれています。 そのため、ただドキュメントを開いただけでは文字を書き込めず、 本文に対して段落や表を追加する必要があります。
ドキュメントを編集するには、まず 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 は「会話のまとまり」を意識する