mcpField
S
spreadsheet-automation

spreadsheet-automation

github.com/jk-0001データ・データベース37 回インストール
リポジトリ

spreadsheet-automation について

Google Sheetsを使う人向けの自動化ガイドです。数式、Apps Script、複数シートの設計、外部ツールとの連携を扱い、反復的なデータ処理や業務フローをシート上で自動化する方法を紹介します。

主な機能

  1. 01高度な数式とデータ整形
  2. 02複数シートのシステム設計
  3. 03Apps Scriptによる定期・イベント実行
  4. 04Zapier、Make、n8nとの連携
  5. 05ダッシュボードとレポートの自動更新

活用シーン

  1. 01複数のシートからデータを集約
  2. 02条件に応じたメールや通知の送信
  3. 03軽量CRMとリード用ダッシュボードの構築
  4. 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分):

  1. Sheetsで手作業しているタスクをリストアップする(コピー/貼り付け、データ入力、書式設定、ほかのシートの更新)
  2. どのタスクが繰り返し発生しますか?(毎日、毎週、イベント発生時)
  3. 1回あたり5分以上かかるタスクはどれですか?
  4. 明確なロジックがあるタスクはどれですか?(「これなら、あれをする」)

すぐに着手できる項目のチェックリスト:

  • ほかのセルに基づいてセルを自動入力する(数式)
  • 外部ソースからデータを取得する(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 を開く方法:

  1. Google スプレッドシートを開きます
  2. 拡張機能 → Apps Script を選択します
  3. エディタでコードを記述します
例 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
    });
  }
}

設定方法:

  1. Apps Script エディタにコードを貼り付けます
  2. 保存します(Ctrl/Cmd + S)
  3. トリガーを設定します:トリガー(時計アイコン)→ トリガーを追加 → onEdit → スプレッドシートから → 編集時 → 保存
  4. プロンプトが表示されたら、権限を承認します
例 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]);
  });
}

設定方法:

  1. コードを貼り付け、url と YOUR_API_KEY を置き換えます
  2. テストのため、手動で 1 回実行します(実行ボタンをクリックします)
  3. 時間主導型トリガーを設定します:トリガー → トリガーを追加 → 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 のリソース:


ステップ 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 万行以上のシートで複雑な数式を使うと、読み込みや編集が遅くなる

解決策:

  1. FILTER + SORT の代わりに QUERY を使う: より効率的です
  2. ARRAYFORMULA の範囲を制限する: A:A(列全体)ではなく A2:A1000 を使います
  3. 可能であれば数式の代わりに静的な値を使う: コピー → 値のみ貼り付け
  4. 複数のシートに分割する: 古いデータを別のシートにアーカイブします
  5. Importrange の使用は控えめにする: 呼び出しのたびに読み込み時間が増えます
  6. 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 万行以上に達したら、実際のデータベースに移行しましょう。

コメント