ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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 => `${c} `).join("") + " ";
});
html += "
";
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 | ドキュメントが開かれた |
| onFormSubmit | Google 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,000 | 100,000 |
| メール送信 / 日 | 100 | 1,500 |
| トリガー実行時間 / 日 | 90 分 | 6 時間 |
| 同時実行 | 30 | 30 |
- 長時間処理は分割: 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 が必須。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?