spreadsheet-automation について
Google Sheetsを使う人向けの自動化ガイドです。数式、Apps Script、複数シートの設計、外部ツールとの連携を扱い、反復的なデータ処理や業務フローをシート上で自動化する方法を紹介します。
主な機能
- 01高度な数式とデータ整形
- 02複数シートのシステム設計
- 03Apps Scriptによる定期・イベント実行
- 04Zapier、Make、n8nとの連携
- 05ダッシュボードとレポートの自動更新
活用シーン
- 01複数のシートからデータを集約
- 02条件に応じたメールや通知の送信
- 03軽量CRMとリード用ダッシュボードの構築
- 04APIデータの定期取得とシートへの書き込み
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jk-0001/ skills --skill spreadsheet-automationインストール後、Claude Code で/spreadsheet-automationを入力して読み込まれたか確認します。
詳細
スプレッドシートの自動化
概要
Google Sheetsは、予算やリストを管理するだけのものではありません。適切な数式、Apps Script、連携機能を使えば、データベース、CRM、プロジェクトトラッカー、分析ダッシュボード、ワークフローエンジンとして、すべてを1つの無料ツールで実現できます。このプレイブックでは、月額50~500ドルのSaaSツールに代わる、本番環境で使えるシステムをSheetsで構築する方法を紹介します。
ステップ1:Sheetsで自動化する対象を見極める
すべてのワークフローがSheetsに適しているわけではありません。Sheetsが適した場面を紹介します。
Sheetsの自動化に適した用途:
- 複数のソースからのデータ収集(フォームの回答、APIデータ、手動入力)→ 1か所に集約
- 軽量なデータベース(顧客リスト、在庫、プロジェクトトラッカー)→ 1万行未満で、基本的なリレーションがあるもの
- ダッシュボードとレポート(ほかのツールからデータを取り込み、可視化して共有)
- ワークフローのトリガー(行が追加/更新されたときにメールを送信、タスクを作成、別のシートを更新)
- データ変換(扱いにくいソースのデータをクリーンアップ、書式設定、補完)
不向きな用途(代わりに本格的なデータベースやツールを使用してください):
- 大量の計算(数百万行、複雑なクエリ)→ BigQuery、Airtable、またはSQLデータベースを使用
- 10人以上が同時に行うリアルタイムの共同作業 → Airtable、Notion、または専用のプロジェクト管理ツールを使用
- 誤って削除されると困るミッションクリティカルなデータ → バックアップとバージョン管理に対応した本格的なデータベースを使用
- 複雑なリレーショナルデータ(多対多のリレーション)→ Airtableまたは適切なデータベースを使用
現在の手作業を監査する(10分):
- Sheetsで手作業しているタスクをリストアップする(コピー/貼り付け、データ入力、書式設定、ほかのシートの更新)
- どのタスクが繰り返し発生しますか?(毎日、毎週、イベント発生時)
- 1回あたり5分以上かかるタスクはどれですか?
- 明確なロジックがあるタスクはどれですか?(「これなら、あれをする」)
すぐに着手できる項目のチェックリスト:
- ほかのセルに基づいてセルを自動入力する(数式)
- 外部ソースからデータを取得する(API、ほかのシート、ウェブスクレイピング)
- データを自動で書式設定またはクリーンアップする(重複の削除、日付の標準化、値の抽出)
- 条件を満たしたときに通知を送信する(メールアラート、Slackメッセージ)
- 自動更新されるグラフやダッシュボードを作成する
- Sheetsとほかのツールの間でデータを同期する(CRM、プロジェクト管理、会計)
ステップ2:高度な数式を使いこなす(コード不要)
Sheetsの自動化は、たいていここから始まります。これらの数式を使いこなせば、Apps Scriptを使わずに必要なものの80%を構築できます。
数式の基本リファレンス
QUERY(Sheets での SQL 風クエリ):
=QUERY(A1:D100, "SELECT A, B, C WHERE D > 1000 ORDER BY C DESC")
- 用途:データのフィルタリング、並べ替え、グループ化、要約
- 構文:
SELECT [columns] WHERE [condition] ORDER BY [column] LIMIT [number] - 例:注文額が $1,000 を超えるすべての顧客を抽出し、日付順に並べ替える
IMPORTRANGE(他のシートからデータを取得):
=IMPORTRANGE("spreadsheet_url", "Sheet1!A1:D100")
- 用途:複数のシートのデータを 1 つのマスターシートに集約する
- 設定:初回はアクセスの承認が必要です(プロンプトが表示されたら「アクセスを許可」をクリックします)
- 例:地域チームのシートから売上データを取得し、1 つのマスターダッシュボードに集約する
ARRAYFORMULA(列全体に数式を適用):
=ARRAYFORMULA(IF(A2:A="",,B2:B*C2:C))
- 用途:すべての行を自動計算する(数式を下までドラッグする必要はありません)
- 例:追加されるすべての新しい行で、数量 × 価格を自動計算する
VLOOKUP / XLOOKUP(別のテーブルから値を検索):
=VLOOKUP(A2, Sheet2!A:B, 2, FALSE)
- 用途:関連データを照合して取得する(例:顧客名からメールアドレスを取得する)
- XLOOKUP(新しい関数):より柔軟で、左から右にも右から左にも検索できます
FILTER(動的なフィルタリング):
=FILTER(A2:D100, D2:D100>1000, C2:C100="Active")
- 用途:条件を満たす行のみを表示する(データが変更されると自動更新されます)
- 例:売上が $1,000 を超えるアクティブな顧客のみを表示する
UNIQUE(重複を削除):
=UNIQUE(A2:A100)
- 用途:リストから一意の値を抽出する(データソースが変更されると自動更新されます)
REGEXEXTRACT(テキストからパターンを抽出):
=REGEXEXTRACT(A2, "[0-9]{3}-[0-9]{3}-[0-9]{4}")
- 用途:整形されていないテキストから電話番号、メールアドレス、URL、その他のパターンを抽出する
- 例:メールアドレスからドメインを抽出する
IMPORTXML / IMPORTHTML(ウェブデータをスクレイピング):
=IMPORTXML("https://example.com", "//h1")
- 用途:ウェブサイトから最新データ(価格、見出し、テーブル)を取得する
- 例:競合他社の価格を自動的に追跡する
ステップ 3:複数シートのシステムを構築する
単一シートのソリューションには限界があります。複数のシートをシステムとして連携させることで、真価を発揮します。
システムアーキテクチャのパターン:
SHEET 1: Data Entry (input form or manual entry)
↓
SHEET 2: Master Database (cleaned, validated, enriched)
↓
SHEET 3: Dashboard (charts, summaries, insights)
↓
SHEET 4: Exports/Reports (formatted for sharing)
例:Sheets でシンプルな CRM を作成する
シート 1:リード入力フォーム
- 列:名前、メールアドレス、会社、流入元、追加日
- 用途:Google フォームからこのシートに自動入力する
- 入力規則:メール形式のチェック、必須項目
シート 2:リードマスターデータベース
IMPORTRANGEまたは直接参照を使ってシート 1 からデータを取得する- データを拡充:ステータス(新規/連絡済み/見込みあり/成約)、最終連絡日、メモ
- 数式の例:
=IF(ISBLANK(D2), "New", D2)(空欄の場合、ステータスを「新規」に自動設定)
シート 3:ダッシュボード
- リード総数:
=COUNTA(MasterDB!A2:A) - 今週のリード数:
=COUNTIF(MasterDB!E2:E, ">="&TODAY()-7) - コンバージョン率:
=COUNTIF(MasterDB!D2:D, "Closed")/COUNTA(MasterDB!A2:A) - グラフ:流入元別のリード数(円グラフ)
シート 4:週次レポート
- 数式:
=FILTER(MasterDB!A2:E, MasterDB!E2:E>=TODAY()-7) - 今週のリードを自動取得し、レビュー会議で確認する
主な原則:
- 1 シートにつき目的は 1 つにする(入力、保存、表示を混在させない)
- シートの連携には数式を使う(手動でのコピー&ペーストは避ける)
- 重要なシートを保護する(誤編集を防ぐ)
ステップ 4:Apps Script の基本を学ぶ(Sheets 向けの Google の JavaScript)
Apps Script を使うと、数式ではできない操作が可能になります。メールの送信、API 呼び出し、カスタムメニューの作成、スケジュールに沿ったコードの実行などができます。
Apps Script を使う場面:
- 数式ではできない処理(メール送信、API 呼び出し、複雑なロジック)が必要な場合
- スケジュールに沿った自動化(毎時、毎日、毎週)が必要な場合
- カスタム関数やメニュー項目を作成したい場合
Apps Script を開く方法:
- Google スプレッドシートを開きます
- 拡張機能 → Apps Script を選択します
- エディタでコードを記述します
例 1:新しい行が追加されたときにメール通知を送信する
function onEdit(e) {
var sheet = e.source.getActiveSheet();
// Only run on "Lead Entry" sheet
if (sheet.getName() !== "Lead Entry Form") return;
// Get edited row and column
var row = e.range.getRow();
var col = e.range.getColumn();
// If new row added (row > 1 to skip header)
if (row > 1 && col === 1) {
var name = sheet.getRange(row, 1).getValue();
var email = sheet.getRange(row, 2).getValue();
// Send email notification
MailApp.sendEmail({
to: "[email protected]",
subject: "New Lead: " + name,
body: "Name: " + name + "\nEmail: " + email
});
}
}
設定方法:
- Apps Script エディタにコードを貼り付けます
- 保存します(Ctrl/Cmd + S)
- トリガーを設定します:トリガー(時計アイコン)→ トリガーを追加 →
onEdit→ スプレッドシートから → 編集時 → 保存 - プロンプトが表示されたら、権限を承認します
例 2:API からデータを取得してシートに書き込む
function fetchAPIData() {
var url = "https://api.example.com/data";
var options = {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
};
var response = UrlFetchApp.fetch(url, options);
var data = JSON.parse(response.getContentText());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("API Data");
// Clear existing data
sheet.clear();
// Write headers
sheet.appendRow(["ID", "Name", "Value"]);
// Write data rows
data.forEach(function(item) {
sheet.appendRow([item.id, item.name, item.value]);
});
}
設定方法:
- コードを貼り付け、
urlとYOUR_API_KEYを置き換えます - テストのため、手動で 1 回実行します(実行ボタンをクリックします)
- 時間主導型トリガーを設定します:トリガー → トリガーを追加 →
fetchAPIData→ 時間主導型 → 時間ベースのタイマー → 1 時間ごと
例 3:古い行を自動でアーカイブする
function archiveOldRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("Active Tasks");
var archiveSheet = ss.getSheetByName("Archive");
var data = sourceSheet.getDataRange().getValues();
var today = new Date();
var cutoffDate = new Date(today.getTime() - (30 * 24 * 60 * 60 * 1000)); // 30 days ago
// Start from row 2 (skip header)
for (var i = data.length - 1; i >= 1; i--) {
var rowDate = new Date(data[i][3]); // Column D = date
if (rowDate < cutoffDate) {
// Copy row to archive
archiveSheet.appendRow(data[i]);
// Delete from source
sourceSheet.deleteRow(i + 1);
}
}
}
Apps Script の一般的なパターン:
- データを取得:
sheet.getRange("A1:D10").getValues() - データを書き込む:
sheet.getRange("A1").setValue("Hello") - 行を追加:
sheet.appendRow([val1, val2, val3]) - メールを送信:
MailApp.sendEmail(to, subject, body) - HTTP リクエストを送信:
UrlFetchApp.fetch(url, options) - 現在の日付を取得:
new Date()
Apps Script のリソース:
- 公式ドキュメント:https://developers.google.com/apps-script
- ChatGPT または Claude:「[do X] を行う Apps Script を作成して」→ コピー/貼り付け/テスト
ステップ 5:Sheets を他のツールに接続する(Zapier、Make、n8n)
Sheets は他のツールと連携すると、10 倍強力になります。
連携方法:
方法 1:データベースとして Sheets を使う(書き込み専用)
用途:フォーム、Webhook、その他のツールからデータを収集 → 保存のために Sheets に書き込む
ワークフローの例(Zapier/Make):
TRIGGER: New Typeform submission
ACTION 1: Add row to Google Sheets
ACTION 2: Send email confirmation (optional)
ワークフローの例(Webhook → Sheets):
TRIGGER: Webhook received (from website, Stripe, etc.)
ACTION: Parse JSON → Write to Google Sheets
方法 2:トリガーとして Sheets を使う(読み取り専用)
用途:Sheets に行が追加/更新されたとき → 別の場所でアクションをトリガーする
ワークフローの例:
TRIGGER: New row in Google Sheets (check every 15 min)
CONDITION: Status column = "Approved"
ACTION: Create task in Asana / Send email / Post to Slack
方法 3:中継役として Sheets を使う(読み取り+書き込み)
用途:Sheets がツール A からデータを取得し、処理してからツール B に送る
ワークフローの例(CRM とメールツールの同期):
TRIGGER: New row in Google Sheets (CRM export)
CONDITION: Email column not empty + Tag column = "Newsletter"
ACTION: Add contact to ConvertKit / Mailchimp
Sheets 連携に最適なツール:
- Zapier: 最も簡単で、対応アプリも最多。月額 $20-50
- Make(Integromat): より高機能で視覚的。月額 $9-30
- n8n: セルフホスト可能で無制限、無料(ホスト版は月額 $20)
一般的な連携:
- Google Forms → Sheets(標準機能のため、ツールは不要)
- Sheets → Gmail(Sheet のデータに基づいてメールを送信)
- Sheets → Slack(Sheet の変更時に Slack に更新情報を投稿)
- Sheets ↔ Airtable(双方向でデータを同期)
- API → Sheets(あらゆる API から Sheets にデータを取得)
ステップ 6:実際の自動化例
例 1:請求書トラッカーの自動化
問題: 送信済み、支払い済み、支払い期限超過の請求書を手作業で追跡している
解決策:
シート 1:請求書ログ
- 列:請求書番号、クライアント、金額、送信日、支払期限、ステータス、期限超過日数
数式の活用:
Status = =IF(G2="Paid", "Paid", IF(E2<TODAY(), "Overdue", "Pending"))
Days Overdue = =IF(E2<TODAY(), TODAY()-E2, 0)
Apps Script(毎日実行):
function sendOverdueReminders() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Invoice Log");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
var status = data[i][6]; // Status column
var client = data[i][1];
var invoiceNum = data[i][0];
var amount = data[i][2];
if (status === "Overdue") {
MailApp.sendEmail({
to: "[email protected]",
subject: "Reminder: Invoice " + invoiceNum + " Overdue",
body: "Hi " + client + ",\n\nInvoice " + invoiceNum + " for $" + amount + " is overdue. Please remit payment.\n\nThank you!"
});
}
}
}
トリガー: 時間ベース、毎日午前 9 時
例 2:リードのスコアリングシステム
問題: 適合度に基づいてリードを手作業で評価している
解決策:
シート 1:リードデータ
- 列:名前、会社規模、業界、予算、緊急度、スコア、優先度
数式によるスコアリング:
Score = =
IF(B2="Enterprise", 30, IF(B2="Mid-Market", 20, 10)) +
IF(C2="SaaS", 20, IF(C2="E-commerce", 15, 5)) +
IF(D2>10000, 30, IF(D2>5000, 20, 10)) +
IF(E2="Immediate", 20, IF(E2="This Quarter", 10, 0))
Priority = =IF(F2>=70, "Hot", IF(F2>=50, "Warm", "Cold"))
自動化(Zapier):
TRIGGER: New row in Google Sheets
CONDITION: Priority = "Hot"
ACTION 1: Add to Pipedrive as high-priority deal
ACTION 2: Send Slack notification to sales team
例 3:コンテンツカレンダー+自動公開
問題: ソーシャルメディアの投稿を手作業で追跡・スケジュールしている
解決策:
シート 1:コンテンツカレンダー
- 列:日付、プラットフォーム、投稿テキスト、画像 URL、ステータス
Apps Script(1 時間ごとに実行):
function publishScheduledPosts() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Content Calendar");
var data = sheet.getDataRange().getValues();
var now = new Date();
for (var i = 1; i < data.length; i++) {
var scheduleDate = new Date(data[i][0]);
var status = data[i][4];
// If scheduled for now or past, and not yet published
if (scheduleDate <= now && status === "Scheduled") {
var platform = data[i][1];
var text = data[i][2];
// Call API to post (Twitter, LinkedIn, etc.)
postToAPI(platform, text);
// Mark as published
sheet.getRange(i+1, 5).setValue("Published");
}
}
}
function postToAPI(platform, text) {
// Example: Twitter API call
var url = "https://api.twitter.com/2/tweets";
var payload = JSON.stringify({"text": text});
var options = {
"method": "POST",
"headers": {
"Authorization": "Bearer YOUR_TWITTER_TOKEN",
"Content-Type": "application/json"
},
"payload": payload
};
UrlFetchApp.fetch(url, options);
}
ステップ 7:パフォーマンスとスケーラビリティ
Sheets の動作が遅くなってきたとき:
問題: 1 万行以上のシートで複雑な数式を使うと、読み込みや編集が遅くなる
解決策:
- FILTER + SORT の代わりに QUERY を使う: より効率的です
- ARRAYFORMULA の範囲を制限する:
A:A(列全体)ではなくA2:A1000を使います - 可能であれば数式の代わりに静的な値を使う: コピー → 値のみ貼り付け
- 複数のシートに分割する: 古いデータを別のシートにアーカイブします
- Importrange の使用は控えめにする: 呼び出しのたびに読み込み時間が増えます
- Apps Script でデータをキャッシュする: 外部データを一度取得して保存し、リアルタイムの数式ではなく定期的に更新します
Sheets から移行するタイミング:
- 5 万行以上 → Airtable または BigQuery を使います
- 20 人以上でリアルタイムに共同作業する → Airtable または Notion を使います
- 複雑なリレーショナルクエリ → Airtable または SQL データベースを使います
- ミッションクリティカルなデータ → バックアップ機能を備えた適切なデータベースを使います
バックアップ方法:
- バージョン履歴: ファイル → バージョン履歴(Google が自動保存するため、復元できます)
- エクスポートの自動化: Apps Script で毎週 Google Drive にエクスポートします
- コピーをダウンロード: ファイル → ダウンロード → Excel または CSV(手動バックアップ)
ステップ 8:スプレッドシート自動化の ROI
ROI の計算:
Time Saved per Month (hours) = (Minutes per task / 60) × Frequency per month
Monthly Value = Time Saved × Hourly Rate
Setup Cost = (Setup time in hours × Hourly Rate) + Tool costs
Payback Period (months) = Setup Cost / Monthly Value
If payback period < 3 months → Definitely worth it
If payback period > 6 months → Probably not worth it
例:
Task: Manually entering form submissions into CRM (15 min, 40x/month = 10 hours/month saved)
Your hourly rate: $50/hour
Monthly value saved: $500
Setup time: 2 hours
Setup cost: $100 (time) + $0 (Google Forms + Sheets are free)
Payback: $100 / $500 = 0.2 months → Absolutely worth it
ルール: 月に 5 時間以上の時間を節約できるなら、自動化しましょう。
スプレッドシート自動化で避けるべきミス
- すべてを 1 つの巨大なシートにまとめる。 複数のシート(入力、データベース、ダッシュボード、エクスポート)に分けましょう。
- 重要なシートを保護しない。 誤って削除すると、システム全体が消えてしまうことがあります。データ → シートと範囲を保護を使用しましょう。
- 揮発性関数を多用する。
NOW()、TODAY()、RAND()は頻繁に再計算されるため、シートの動作が遅くなります。使用は控えめにしましょう。 - 数式を記録しない。 複雑な数式を説明するコメントを追加しましょう(セルを右クリック → コメントを挿入)。
- Apps Script のトリガー設定を忘れる。 トリガー(onEdit、時間主導型など)を設定しないと、コードは実行されません。
- 自動化を本番稼働前にテストしない。 まずはダミーデータでテストしましょう。100 通のメールを送信する自動化が壊れていたら大惨事です。
- 本来の用途に合わない使い方をする。 2 万行以上に達したら、実際のデータベースに移行しましょう。