Google各サービスとの連携を極める
GASの真骨頂は、Googleの各アプリを自在に繋ぎ合わせることにあります。
「点」の知識をつなぎ、「毎回人がやっている作業」を「仕組み」に変えていきましょう。
連携を学ぶ前に知っておきたいこと
Step 2 では、スプレッドシートのセルに書き込む・読み取るという「単体操作」を学びました。 このStepでは、その知識を土台にして、Gmail、Calendar、Drive、Document などの別サービスに処理を広げていきます。
ここで大事なのは、「どのサービスから情報を取り、どこへ結果を出すのか」を意識することです。 たとえば「シートの内容を読んでメールを送る」「カレンダーの予定を取得してシートに書き出す」といったように、 入力元と出力先を明確にすると、コードの意味が理解しやすくなります。
このStepで身につけたい視点
- どのGoogleサービスを操作しているのかを意識する
- 入力元と出力先を整理して考える
- 便利さだけでなく、誤送信・誤更新などのリスクも意識する
Gmail連携:自動通知の作成
メール送信は GmailApp.sendEmail(宛先, 件名, 本文) が基本です。
実務では、通知メール、確認メール、一斉案内など、メール送信を自動化できる場面が多くあります。
ただし、メールは相手に届く処理なので、他の操作よりも慎重さが必要です。
ここがポイント:宛先と本文の工夫
- 自分のアドレス:
Session.getActiveUser().getEmail()を使うと、自分宛のテストメールを送りやすくなります。 - 改行:
\nは本文中の改行を意味します。読みやすいメールにするために重要です。 - 文字列の組み立て: 名前や日付を本文に差し込むと、固定文だけでなく状況に応じた通知が作れます。
function dynamicEmail() { // 1. 実行している自分のメールアドレスを取得 const myEmail = Session.getActiveUser().getEmail(); const userName = "山田太郎"; // 2. 本文を組み立てる const body = userName + " 様\n\n2026年度のプロジェクトが開始されました。"; // 3. 送信 GmailApp.sendEmail(myEmail, "【2026】開始通知", body); }
このコードの流れ
- 送信先のメールアドレスを取得する
- 名前入りの本文を作る
- 件名・本文を指定して送信する
ポイントは、いきなり送るのではなく、まず「誰に」「何を送るか」を変数で明確にしていることです。
初心者がつまずきやすい点
- いきなり他人に送ると、誤送信のリスクがあります。最初は必ず自分宛でテストしましょう。
sendEmailの引数の順番を間違えると、件名や本文が意図しない形になります。- 改行を入れないと、読みづらい1行メールになりやすいです。
実務での留意点
メール自動送信は便利ですが、送信先リストの誤り、本文の差し込みミス、同じメールの重複送信などが起きると影響が大きくなります。 実務では、まず「自分宛テスト」→「少人数テスト」→「本番」の順に段階を踏むことが重要です。
Gmail Challenge
「スプレッドシートのA1セルに入力されたテキストを読み取り、それを『件名』にして、自分のメールアドレス宛にメールを送信してください。 sendEmailの本文の引数は、"本文なし"にしてください。」
function ansGmail() { const title = SpreadsheetApp.getActiveSheet().getRange("A1").getValue(); const myEmail = Session.getActiveUser().getEmail(); GmailApp.sendEmail(myEmail, title, "本文なし"); }
ここでは、シートから読み取った値をそのまま件名に使っています。 本文を空にすることは避けた方がよいため、学習用としては「本文なし」など最低限の文字を入れておく方が分かりやすいです。
Calendar連携:予定をシートに書き出す
「カレンダーを開いて予定を確認する」という作業も自動化できます。
予定を取得するには、いつからいつまでの範囲かを指定して getEvents() を使います。
つまりカレンダー連携では、時間の範囲を扱うことが重要になります。
ここがポイント:予定のリストを扱う
予定は1件とは限らず、複数返ってくるのが普通です。
そのためGASは予定を「リスト(配列)」として返します。
for文を使うことで、1件ずつ取り出してシートに書き込めます。
function exportEvents() { const sheet = SpreadsheetApp.getActiveSheet(); const now = new Date(); // 7日後を計算 const sevenDaysLater = new Date(now.getTime() + (7 * 24 * 60 * 60 * 1000)); // 1週間分の予定を取得 const events = CalendarApp.getDefaultCalendar().getEvents(now, sevenDaysLater); // 予定の数だけ繰り返してシートに書き出す for (const event of events) { sheet.appendRow([event.getStartTime(), event.getTitle()]); } }
このコードの流れ
- 現在時刻を取得する
- 7日後を計算する
- その範囲の予定を取得する
- 1件ずつシートへ追加する
初心者がつまずきやすい点
- カレンダーは「1件だけ」返るのではなく、配列で返ることを見落としやすいです。
- 開始日時と終了日時の指定を間違えると、予定が取れなかったり、想定外の範囲が出たりします。
appendRow()を何度も使うと、実行のたびにどんどん追記される点に注意が必要です。
実務での留意点
予定を書き出す処理は便利ですが、毎回追記だけすると重複データが増えます。 実務では「先に既存データを消す」「日付ごとに上書きする」「同じ予定を判定して重複を防ぐ」などの設計が必要です。
Calendarでよく使う取得情報
getEvents() で取得した予定は、1件ずつ event として扱えます。
その event から、次のような情報を取り出せます。
| メソッド | 意味 | よくある使い道 |
|---|---|---|
| event.getTitle() | 予定のタイトル | 会議名や予定名をシートへ書き出す |
| event.getStartTime() | 開始日時 | 開始時刻つきの一覧表を作る |
| event.getEndTime() | 終了日時 | 所要時間の確認、終了時刻の一覧化 |
| event.getDescription() | 予定の説明文 | 議題やメモの転記 |
| event.getLocation() | 場所 | 会議室や訪問先の一覧化 |
| event.getGuestList() | 参加者一覧 | 出席者確認や参加者情報の取得 |
| event.isAllDayEvent() | 終日予定かどうか | 終日予定と時刻指定予定を分けて扱う |
Calendar Challenge
「今日1日分(現在から深夜0時まで)の予定を取得し、予定の『タイトル』だけをスプレッドシートの最終行に次々と追加するプログラムを作ってください」
function ansCal() { const now = new Date(); // 今日の終わりの時刻を作成 const todayEnd = new Date(); todayEnd.setHours(23, 59, 59); const events = CalendarApp.getDefaultCalendar().getEvents(now, todayEnd); const sheet = SpreadsheetApp.getActiveSheet(); for (const event of events) { sheet.appendRow([event.getTitle()]); } }
この問題では、時間範囲の指定と for 文による繰り返しがポイントです。 カレンダー連携では「配列を扱う」感覚に慣れることが大切です。
Drive連携:ファイル・フォルダ管理
Drive連携をマスターするコツは、「フォルダ」や「ファイル」をオブジェクトとして扱うことに慣れることです。 いったん作成したフォルダを変数に入れておけば、その中にファイルを作る、といった流れを自然に書けるようになります。
ここがポイント:オブジェクトの連鎖
「フォルダの中にファイルを作る」のは、現実と同じく2段階で考えると分かりやすいです。
const folder = DriveApp.createFolder("2026年資料");でフォルダを作るfolder.createFile("メモ.txt", "...");でその中にファイルを作る
function folderOperation() { // 2026年度用のフォルダを作成 const newFolder = DriveApp.createFolder("2026年_重要ドキュメント"); // 作成したばかりのフォルダ内にファイルを作成する newFolder.createFile("README.txt", "このフォルダはGASで自動生成されました。"); }
このコードの流れ
まずフォルダを作り、その戻り値を newFolder に入れています。
そのあと newFolder.createFile() と書くことで、
「今作ったそのフォルダの中にファイルを作る」という意味になります。
初心者がつまずきやすい点
- フォルダを作っただけでは、その中にファイルは作られません。別の命令が必要です。
- 同じ名前のフォルダを何度も作ると、Drive 上に同名フォルダが増えて管理しづらくなります。
new Date().toString()のような名前は長くなりやすく、実務では整形した日付文字列の方が扱いやすいです。
実務での留意点
Drive連携では、「どこに作るか」「同名ファイルをどう扱うか」「毎回新規作成でよいか」を考える必要があります。 学習中は作成系の処理が分かりやすいですが、実務では既存フォルダを検索して使い回す設計もよくあります。
Drive Challenge
「『バックアップ』という名前のフォルダを作成し、その中に今日の日付を名前にした空のファイルを作成してください」
function ansDrive() { const folder = DriveApp.createFolder("バックアップ"); const fileName = new Date().toString(); folder.createFile(fileName, ""); }
学習用としてはこれで十分ですが、実務ではファイル名をもっと短く分かりやすく整えることが多いです。 たとえば「2026-04-13_backup.txt」のようにすると管理しやすくなります。
Document連携:文書の自動作成
ドキュメント作成の基本は、getBody() で文書の「本文」を取得することです。
ドキュメントそのものを作っただけでは文字は書き込めず、本文部分に対して操作する必要があります。
ここがポイント:一行ずつ追加する
appendParagraph() は、最後に新しい段落として文字を追加する命令です。
そのため、報告書や議事録のように、行を分けながら追記したいときに使いやすい方法です。
doc.getBody().appendParagraph("タイトル");doc.getBody().appendParagraph("本文...");
function createReport() { // 新しいドキュメントを作成 const doc = DocumentApp.create("2026年度_活動報告"); const body = doc.getBody(); // 文字を追加 body.appendParagraph("作成日:" + new Date()); body.appendParagraph("今期の目標:GASで業務を100時間削減する"); }
このコードの流れ
- 新しいドキュメントを作る
- その本文を取得する
- 本文に段落を追加していく
初心者がつまずきやすい点
- ドキュメントを作成しただけで文字が書けると思いがちですが、本文の取得が必要です。
new Date()は日時まで含むため、見た目が長くなることがあります。- 毎回新規作成すると文書が増え続けるため、テスト時はDrive内の増え方にも注意が必要です。
実務での留意点
実務では、文書を毎回ゼロから作るだけでなく、テンプレートをコピーして差し込みを行う方法がよく使われます。 ただし、最初は「作る→本文を取る→文字を足す」という基本形を理解することが先です。
Document Challenge
「新規ドキュメント『テストレポート』を作成し、スプレッドシートのA1セルの値を1行目に書き込んでください」
function ansDoc() { const val = SpreadsheetApp.getActiveSheet().getRange("A1").getValue(); const doc = DocumentApp.create("テストレポート"); doc.getBody().appendParagraph(val); }
この問題では、「シートから値を取る」と「ドキュメントに書く」をつなげています。 連携処理では、このように複数サービスをまたいで考えるのが基本です。
Step 3 完了!
おめでとうございます。これで、GASを使ってGoogleの複数サービスをつなぐ基本が身につきました。
大切なのは、単にコードを覚えることではなく、「どこから情報を取り、どこへ渡すのか」を整理して考えることです。