13.

Google Apps Script (GAS) 完全ガイド — Spreadsheet/Gmail 自動化

編集
この記事の要点
  • Google Apps Script (GAS) は Google のサーバ上で動作する JavaScript ベースのスクリプト言語。Workspace 製品の自動化に特化
  • Spreadsheet / Gmail / Drive / Calendar / Forms / Slides 等を専用 API で直接操作可能、認証不要 (実行時の Google アカウントを利用)
  • V8 ランタイム (2020〜) で ES2015+ (let/const/アロー関数/class/destructuring) 対応、現代的 JS が書ける
  • トリガー: 時間ベース (毎日 / 毎時) / フォーム送信時 / シート編集時 / カレンダー更新時に自動実行
  • Web アプリ公開: doGet/doPost を実装すると HTML を返す Web アプリやシンプル API が公開できる
  • clasp CLI で TypeScript ローカル開発 + GitHub 管理が可能
  • 料金は無料 (Google アカウントがあれば誰でも)、Workspace 契約での実行枠拡大あり

GAS とは

Google Apps Script (GAS) は、Google が提供する サーバサイド JavaScript ランタイムです。Spreadsheet / Gmail / Drive / Calendar 等の Google サービスを標準提供 API オブジェクトで直接操作でき、認証コードを一切書かずに「自分のアカウントとして」処理を実行できます。Excel VBA の Google 版と表現されることもあります。

2020 年に V8 エンジンへ移行し、ES2015 以降の現代的 JavaScript が書けるようになりました。以前は Rhino エンジン (ES5 相当) だったため大きな進歩です。

基本: スプレッドシート操作

// 関数名は自由、Apps Script エディタで実行
function appendRow() {
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([new Date(), "Hello", 42]);
}

// 範囲取得・編集
function highlightLargeValues() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("B2:B100");
  const values = range.getValues();

  values.forEach((row, i) => {
    if (row[0] > 1000) {
      sheet.getRange(i + 2, 2).setBackground("#fff3cd");
    }
  });
}

// カスタム関数 (=MYDOUBLE(A1) のようにセルから呼べる)
function MYDOUBLE(value) {
  return value * 2;
}

Gmail を自動送信

function sendDailyReport() {
  const sheet = SpreadsheetApp.openById("YOUR_SHEET_ID").getSheetByName("レポート");
  const data = sheet.getDataRange().getValues();

  let html = "

本日のレポート

"; data.forEach(row => { html += "" + row.map(c => ``).join("") + ""; }); html += "
${c}
"; MailApp.sendEmail({ to: "boss@example.com", subject: `日次レポート ${Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd")}`, htmlBody: html, }); } // 受信ボックスから条件メールを抽出 function fetchInvoiceMails() { const threads = GmailApp.search("subject:請求書 newer_than:7d"); threads.forEach(t => { t.getMessages().forEach(m => { console.log(m.getFrom(), m.getSubject(), m.getDate()); }); }); }

Drive / Calendar 操作

// Drive にファイル作成
function createFile() {
  const folder = DriveApp.getFolderById("FOLDER_ID");
  const file = folder.createFile("memo.txt", "Hello from GAS", MimeType.PLAIN_TEXT);
  console.log(file.getUrl());
}

// Calendar にイベント追加
function addEvent() {
  const cal = CalendarApp.getDefaultCalendar();
  cal.createEvent(
    "週次会議",
    new Date("2026-05-20 10:00"),
    new Date("2026-05-20 11:00"),
    { description: "議題: Q2 振り返り", guests: "alice@example.com" }
  );
}

トリガー (自動実行)

GAS の真価はトリガーにあります。GUI またはコードで設定できます:

トリガー発火タイミング
時間ベース毎分 / 毎時 / 毎日 / 毎週の指定時刻
onEditシートが編集された (リアルタイム)
onOpenドキュメントが開かれた
onFormSubmitGoogle Forms が送信された
onChangeシート構造が変更された (行追加など)
カレンダーイベント更新カレンダーが変更された
// シート編集時のシンプルトリガー
function onEdit(e) {
  const sheet = e.range.getSheet();
  if (sheet.getName() === "受注") {
    sheet.getRange(e.range.getRow(), 10).setValue(new Date());  // 編集時刻記録
  }
}

// プログラムでトリガー作成
function installTrigger() {
  ScriptApp.newTrigger("sendDailyReport")
    .timeBased()
    .everyDays(1)
    .atHour(9)
    .create();
}

Web アプリ公開 (doGet / doPost)

// 簡易 API としても使える
function doGet(e) {
  const q = e.parameter.q || "world";
  return ContentService
    .createTextOutput(JSON.stringify({ message: `Hello, ${q}!` }))
    .setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  const body = JSON.parse(e.postData.contents);
  // Spreadsheet に記録
  SpreadsheetApp.getActiveSheet().appendRow([new Date(), body.name, body.value]);
  return ContentService.createTextOutput("OK");
}

// HTML ページを返す
function doGet_html() {
  return HtmlService
    .createTemplateFromFile("index")  // index.html を作成
    .evaluate()
    .setTitle("My GAS App");
}

エディタ → デプロイ → 新しいデプロイ → 「ウェブアプリ」を選択 → 公開 URL を取得。これだけで API として利用可能になります。

外部 API 呼び出し

function fetchWeather() {
  const res = UrlFetchApp.fetch(
    "https://api.example.com/weather?city=tokyo",
    {
      headers: { "X-API-Key": PropertiesService.getScriptProperties().getProperty("API_KEY") },
      muteHttpExceptions: true,
    }
  );
  const data = JSON.parse(res.getContentText());
  console.log(data);
}

// PropertiesService で機密情報を保存 (コードに書かない)
function setupKey() {
  PropertiesService.getScriptProperties().setProperty("API_KEY", "xxxxxxxxxx");
}

clasp で TypeScript ローカル開発

# clasp インストール
npm install -g @google/clasp

# Google にログイン
clasp login

# 既存プロジェクトをクローン
clasp clone <スクリプト ID>

# ローカル編集 → push
clasp push

# 最新を取得
clasp pull

# TypeScript で書く場合
npm install -D @types/google-apps-script
# tsconfig.json を作って .ts ファイルを書ける (clasp が trans-compile)

制限と注意点

項目無料アカウントWorkspace
実行時間 (1 回)6 分30 分
UrlFetch 回数 / 日20,000100,000
メール送信 / 日1001,500
トリガー実行時間 / 日90 分6 時間
同時実行3030
  • 長時間処理は分割: 6 分制限を超える処理は state を Properties に保存して continuation
  • cron 的精度は低い: 「毎時 0 分」と設定しても 0-15 分の範囲でゆらぎがある
  • 同時編集に弱い: 複数ユーザがシートを同時編集すると onEdit が連発される

典型ユースケース

  • 業務報告自動化: 毎朝シート集計 → メール送信
  • Forms 受付通知: フォーム送信 → Slack 通知 → シート保存
  • カレンダー連携: 会議室予約スプレッドシート ↔ Google Calendar
  • 受信メール仕分け: 添付ファイルを Drive に保存 + 抽出データをシート化
  • API バックエンド: 小規模 SaaS のバックエンドとして (実行制限を許容できる用途)

FAQ

Q: 課金はある?
A: GAS 自体は無料です。Google Workspace 契約なら実行枠が増えます。外部 API 呼出回数に応じて UrlFetch 制限はあるので、業務利用なら Workspace 推奨。

Q: AWS Lambda / Cloud Functions と比較すると?
A: Google サービスへのアクセスが圧倒的に簡単。逆に外部 DB / 重い処理は Lambda 等のほうが柔軟。中間値が GCP Cloud Functions です。

Q: TypeScript で開発できる?
A: 可能。clasp + @types/google-apps-script で型補完が効きます。本格開発なら強く推奨。

Q: バージョン管理は?
A: clasp 経由で GitHub に同期するのが定番。Apps Script Editor のスナップショット機能もありますが、コードレビューや差分管理には Git が必須。

編集
Post Share
子ページ
  1. 導入手順
  2. GETリクエストする方法
同階層のページ
  1. Java
  2. PHP
  3. Python
  4. C#
  5. C++
  6. Ruby
  7. Go
  8. HTML
  9. CSS
  10. JavaScript
  11. TypeScript
  12. VBA
  13. Google Apps Script
  14. Julia
  15. Swift
  16. オブジェクト指向言語共通
  17. Gen