補助金・助成金の最新情報収集~GASを使い定期実施~

この仕組みの役割

項目説明
何をするのか毎日9時に補助金と助成金の情報を自動収集
どこから取得するのか政府公式サイト(経済産業省・厚生労働省)
どこに保存するのかGoogleスプレッドシート
重複は排除するのかはい。同じ情報は2回以上登録されない

カテゴリ項目内容・詳細
基本仕様役割毎日9時に補助金・助成金の情報を自動収集し、重複を排除して保存
取得元政府公式サイト(経済産業省 jGrants API / 厚生労働省 スクレイピング)
保存先Googleスプレッドシート(一括書き込みで高速記録)
補助金取得 (①)対象・条件全国+福岡県募集中案件(半年以内に開始、締切が近い順)
キーワード中小企業、スタートアップ、デジタル化、IT導入など計7種類
助成金取得 (②)対象・条件厚労省の雇用関係ページ(5ページ分)から助成金、支援金、給付金を抽出
具体例キャリアアップ、人材開発支援、両立支援、働き方改革推進など
重複チェック (③)動作スプレッドシートのG列(URL)を照合し、既存データはスキップ
メリットデータの重複を防ぎ、常に最新かつ一意の情報を維持
記録内容 (④)スプレッドシート構成取得日時、名称、種類、開始/締切日、実施機関、URL、概要/上限額
注目列E列(締切日)でソートすることで、申請期限切れを防止
システム工夫パフォーマンスキャッシュ機能(12時間保存)と待機処理でサーバー負荷を軽減
実行方法トリガー設定による毎朝自動実行、または手動でのテスト実行が可能
運用ガイドQ&A重複防止機能により肥大化を抑制。データは永続保存されるため適宜整理を推奨
活用のコツ毎朝チェックを行い、自社の事業計画と照らし合わせて申請判断に活用

仕組みの全体像

毎日9時に自動実行
    ↓
補助金API(jGrants)から検索
    ↓
助成金情報(厚労省)をスクレイピング
    ↓
重複チェック(既存データと照合)
    ↓
新規データだけをスプレッドシートに追加

4つの重要な処理

① 補助金データの取得(jGrants API)

項目内容
対象地域全国 + 福岡県
検索キーワード中小企業、スタートアップ、デジタル化、IT導入など7種類
募集状態募集中のもののみ
データの鮮度半年以内に募集開始したものだけ
取得順序締切が近い順(期限切れを防ぐ)

取得するキーワード例:

  • 持続化補助金
  • 省力化投資補助金
  • デジタル化・AI導入補助金
  • IT導入補助金

② 助成金データの取得(厚生労働省スクレイピング)

項目内容
取得元厚生労働省の雇用関係ページ(5ページ分)
対象キーワード助成金、支援金、給付金
方式HTMLから自動抽出

取得される助成金の例:

  • キャリアアップ助成金(非正規⇒正社員化)
  • 人材開発支援助成金(従業員教育)
  • 両立支援等助成金(育児・介護休業)
  • 働き方改革推進支援助成金(残業削減)

③ 重複チェック(必須機能)

確認内容動作
既存URLを確認スプレッドシートのG列(URL)をチェック
重複があればスキップ(同じ情報は記録しない)
新規情報ならばスプレッドシートに追加

メリット: スプレッドシートの無駄な重複行が増えず、いつも最新で統一された情報を保つ


④ スプレッドシートへの記録

内容
A列取得日時2025/4/4 9:00:00
B列制度の名称小規模事業者持続化補助金
C列種類補助金 / 助成金
D列募集開始日2025/1/15
E列締切日 2025/5/30
F列実施機関日本商工会議所
G列URLhttps://…
H列概要・上限額対象地域:全国 / 上限:200万円

パフォーマンス工夫(快適な理由)

機能効果
キャッシュ機能重い処理の結果を12時間保存。2回目以降は速い(0.5秒→瞬間)
APIリクエスト制御各リクエスト間に500ms待機。サーバー負荷を軽減
一括書き込み新規データをまとめて1回で記録(1件ずつ書き込まない)

実際の設定手順

トリガー設定(毎日9時に自動実行)

スクリプトエディタで以下を実行:

トリガーを作成する()

結果: 毎日9時に自動で情報取得が開始

テスト実行(今すぐ試したいとき)

テスト実行()

結果: キャッシュをクリアして強制的に最新データを再取得


よくある質問

QA
データが増え続けないか?重複チェックがあるので大丈夫。毎日新規データだけ追加
古い情報は消えないか?消えません。手動で削除するか、定期的に整理が必要
福岡県外の情報は取れないか?現在は「全国」と「福岡県」のみ。拡張可能
失敗したらどうなるか?Loggerに記録される。手動でテスト実行して確認
いつまでスプレッドシートに保存か?永遠に保存。自分で整理・削除が必要

経営者として活用するコツ

毎朝チェック: スプレッドシートを開き、新規追加を確認
締切管理: E列(締切日)でソートして期限切れを防ぐ
候補保存: 該当しそうな案件をコピーして専用シートで整理
事業との照合: 「今年の重点は何か」と照合して申請判断

(参考)コード例

// ============================================================

// メイン関数:毎日実行される

// ============================================================

function 情報を取得する() {

  const シート = SpreadsheetApp.getActiveSheet();

  const 現在日時 = new Date();

  const 補助金情報 = 補助金データを取得();

  Logger.log(“補助金情報:” + 補助金情報.length + “件”);

  const 助成金情報 = 助成金データを取得();

  Logger.log(“助成金情報:” + 助成金情報.length + “件”);

  const 全情報 = 補助金情報.concat(助成金情報);

  if (全情報.length === 0) {

    Logger.log(“情報が見つかりません”);

    return;

  }

  // ── 重複チェック用:既存URLを一覧取得(G列) ───────────

  const 最終行 = シート.getLastRow();

  const 既存URL一覧 = 最終行 >= 2

    ? シート.getRange(2, 7, 最終行 – 1, 1).getValues().flat()

    : [];

  // ── 新規データのみ抽出 ─────────────────────────────────

  const 追加データ = [];

  for (const 行 of 全情報) {

    if (既存URL一覧.includes(行.URL)) {

      Logger.log(“重複スキップ:” + 行.名称);

      continue;

    }

    // A:取得日時 B:名称 C:種類 D:募集開始日 E:締切日 F:実施機関 G:URL H:概要

    追加データ.push([現在日時, 行.名称, 行.種類, 行.募集開始日, 行.締切日, 行.実施機関, 行.URL, 行.概要]);

  }

  // ── まとめて一括書き込み ───────────────────────────────

  if (追加データ.length > 0) {

    const 書込開始行 = シート.getLastRow() + 1;

    シート.getRange(書込開始行, 1, 追加データ.length, 8).setValues(追加データ);

    Logger.log(“新規追加:” + 追加データ.length + “件”);

  } else {

    Logger.log(“新規データなし(すべて重複)”);

  }

}

// ============================================================

// 補助金データを取得(jGrants公式API・複数キーワード×エリア対応)

// ============================================================

function 補助金データを取得() {

  const キャッシュ = CacheService.getScriptCache();

  const キャッシュキー = “補助金データv7”;

  const キャッシュ済み = キャッシュ.get(キャッシュキー);

  if (キャッシュ済み) {

    Logger.log(“補助金データはキャッシュから取得”);

    return JSON.parse(キャッシュ済み);

  }

  const 補助金データ = [];

  const 追加済みID = new Set();

  // ✅ 半年前の日付を計算

  const 半年前 = new Date();

  半年前.setMonth(半年前.getMonth() – 6);

  // ✅ 検索キーワード一覧

  const キーワードリスト = [

    “中小企業”,

    “小規模事業者”,

    “スタートアップ”,

    “持続化補助金”,      // 小規模事業者持続化補助金

    “省力化投資補助金”,  // 省力化投資補助金

    “デジタル化AI導入”,  // デジタル化・AI導入補助金(新名称)

    “IT導入補助金”       // 旧名称でも念のため拾う

  ];

  // ✅ 対象エリア:全国と福岡県のみ

  const エリアリスト = [

    “全国”,

    “福岡県”

  ];

  for (const キーワード of キーワードリスト) {

    for (const エリア of エリアリスト) {

      try {

        const params = {

          keyword: キーワード,

          sort: “acceptance_end_datetime”,

          order: “ASC”,          // 締切が近い順

          acceptance: “1”,       // 募集中のみ

          target_area_search: エリア

        };

        const クエリ = Object.keys(params)

          .map(k => encodeURIComponent(k) + “=” + encodeURIComponent(params[k]))

          .join(“&”);

        const url = “https://api.jgrants-portal.go.jp/exp/v1/public/subsidies?” + クエリ;

        Logger.log(“APIリクエスト[” + キーワード + “/” + エリア + “]:” + url);

        const response = UrlFetchApp.fetch(url, {

          method: “get”,

          muteHttpExceptions: true,

          headers: { “Accept”: “application/json” }

        });

        const ステータス = response.getResponseCode();

        if (ステータス === 200) {

          const json = JSON.parse(response.getContentText());

          const items = json.result || [];

          Logger.log(“取得件数[” + キーワード + “/” + エリア + “]:” + items.length + “件”);

          for (const item of items) {

            if (追加済みID.has(item.id)) continue;

            // ✅ 募集開始日が不明 or 半年以上前のものは除外

            if (!item.acceptance_start_datetime) continue;

            const 開始日 = new Date(item.acceptance_start_datetime);

            if (開始日 < 半年前) {

              Logger.log(“半年以上前のためスキップ:” + item.title);

              continue;

            }

            追加済みID.add(item.id);

            const 補助金ID = item.id || “”;

            const 詳細URL = item.front_subsidy_detail_page_url

              || (“https://www.jgrants-portal.go.jp/subsidy/” + 補助金ID);

            const 募集開始日 = 開始日.toLocaleDateString(“ja-JP”);

            const 締切日 = item.acceptance_end_datetime

              ? new Date(item.acceptance_end_datetime).toLocaleDateString(“ja-JP”)

              : “(不明)”;

            補助金データ.push({

              名称: item.title || “(名称不明)”,

              種類: “補助金”,

              募集開始日: 募集開始日,

              締切日: 締切日,

              実施機関: item.institution_name || “(機関不明)”,

              URL: 詳細URL,

              概要: [

                item.target_area_search ? “対象地域:” + item.target_area_search : “”,

                item.target_number_of_employees ? “対象規模:” + item.target_number_of_employees : “”,

                item.subsidy_max_limit ? “上限額:” + item.subsidy_max_limit.toLocaleString() + “円” : “”

              ].filter(Boolean).join(” / “) || “(概要なし)”

            });

          }

        } else {

          Logger.log(“APIエラー[” + キーワード + “/” + エリア + “]:” + ステータス);

        }

        Utilities.sleep(500);

      } catch (error) {

        Logger.log(“補助金API取得失敗[” + キーワード + “/” + エリア + “]:” + error.message);

      }

    }

  }

  Logger.log(“補助金データ合計:” + 補助金データ.length + “件(半年フィルタ・重複除去済み)”);

  if (補助金データ.length === 0) {

    Logger.log(“デフォルト補助金データを使用”);

    補助金データ.push(

      { 名称: “ものづくり補助金”, 種類: “補助金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “経済産業省”, URL: “https://www.monodukuri-hojo.jp/”,

        概要: “革新的な製品・サービス開発の設備投資を支援” },

      { 名称: “小規模事業者持続化補助金”, 種類: “補助金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “日本商工会議所”, URL: “https://r3.jizokukahojokin.info/”,

        概要: “小規模事業者の販路開拓・生産性向上を支援” },

      { 名称: “デジタル化・AI導入補助金”, 種類: “補助金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “中小企業庁”, URL: “https://it-shien.smrj.go.jp/”,

        概要: “ITツール導入によるデジタル化・AI活用を支援(旧IT導入補助金)” }

    );

  }

  キャッシュ.put(キャッシュキー, JSON.stringify(補助金データ), 43200);

  return 補助金データ;

}

// ============================================================

// 助成金データを取得(厚労省サイト・複数ページ対応)

// ============================================================

function 助成金データを取得() {

  const キャッシュ = CacheService.getScriptCache();

  const キャッシュキー = “助成金データv3”;

  const キャッシュ済み = キャッシュ.get(キャッシュキー);

  if (キャッシュ済み) {

    Logger.log(“助成金データはキャッシュから取得”);

    return JSON.parse(キャッシュ済み);

  }

  const 助成金データ = [];

  try {

    const 取得先リスト = [

      { url: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index.html”, 機関: “厚生労働省” },

      { url: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/career.html”, 機関: “厚生労働省” },

      { url: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/d01-1.html”, 機関: “厚生労働省” },

      { url: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kodomo/shokuba_kosodate/ryouritsu01/index.html”, 機関: “厚生労働省” },

      { url: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000148322.html”, 機関: “厚生労働省” }

    ];

    const 追加済みURL = new Set();

    for (const 取得先 of 取得先リスト) {

      try {

        const response = UrlFetchApp.fetch(取得先.url, {

          method: “get”,

          muteHttpExceptions: true

        });

        if (response.getResponseCode() !== 200) continue;

        const html = response.getContentText(“UTF-8”);

        const リンクパターン = /<a\s+href=”([^”]+)”[^>]*>([^<]{4,60})<\/a>/gi;

        let マッチ;

        const ページタイトルパターン = /<title>([^<]+)<\/title>/i;

        const タイトルマッチ = ページタイトルパターン.exec(html);

        const ページタイトル = タイトルマッチ ? タイトルマッチ[1].trim() : “”;

        if (

          (ページタイトル.includes(“助成金”) || ページタイトル.includes(“支援金”)) &&

          !追加済みURL.has(取得先.url)

        ) {

          追加済みURL.add(取得先.url);

          助成金データ.push({

            名称: ページタイトル.replace(/|.*$/, “”).replace(/\|.*$/, “”).trim(),

            種類: “助成金”,

            募集開始日: “(不明)”,

            締切日: “(不明)”,

            実施機関: 取得先.機関,

            URL: 取得先.url,

            概要: “厚生労働省の雇用関係助成金”

          });

        }

        while ((マッチ = リンクパターン.exec(html)) !== null) {

          const リンク = マッチ[1];

          const 名前 = マッチ[2].trim();

          if (名前.includes(“助成金”) || 名前.includes(“支援金”) || 名前.includes(“給付金”)) {

            const 完全URL = リンク.startsWith(“http”)

              ? リンク

              : リンク.startsWith(“/”)

                ? “https://www.mhlw.go.jp” + リンク

                : “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/” + リンク;

            if (!追加済みURL.has(完全URL)) {

              追加済みURL.add(完全URL);

              助成金データ.push({

                名称: 名前,

                種類: “助成金”,

                募集開始日: “(不明)”,

                締切日: “(不明)”,

                実施機関: 取得先.機関,

                URL: 完全URL,

                概要: “厚生労働省の雇用関係助成金”

              });

            }

          }

        }

        Utilities.sleep(500);

      } catch (e) {

        Logger.log(“個別ページ取得失敗:” + 取得先.url + ” / ” + e.message);

      }

    }

    Logger.log(“厚労省サイトから取得:” + 助成金データ.length + “件”);

  } catch (error) {

    Logger.log(“助成金HTML取得失敗:” + error.message);

  }

  if (助成金データ.length === 0) {

    Logger.log(“デフォルト助成金データを使用”);

    助成金データ.push(

      { 名称: “キャリアアップ助成金”, 種類: “助成金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “厚生労働省”,

        URL: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/career.html”,

        概要: “非正規労働者の正社員化・処遇改善を支援” },

      { 名称: “人材開発支援助成金”, 種類: “助成金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “厚生労働省”,

        URL: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/d01-1.html”,

        概要: “従業員の職業訓練・能力開発を支援” },

      { 名称: “両立支援等助成金”, 種類: “助成金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “厚生労働省”,

        URL: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kodomo/shokuba_kosodate/ryouritsu01/index.html”,

        概要: “育児・介護休業取得者の職場復帰を支援” },

      { 名称: “働き方改革推進支援助成金”, 種類: “助成金”, 募集開始日: “(不明)”, 締切日: “(不明)”,

        実施機関: “厚生労働省”,

        URL: “https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000148322.html”,

        概要: “時間外労働削減・勤務制度整備などを支援” }

    );

  }

  キャッシュ.put(キャッシュキー, JSON.stringify(助成金データ), 43200);

  return 助成金データ;

}

// ============================================================

// トリガー設定(毎日9時)

// ============================================================

function トリガーを作成する() {

  ScriptApp.getProjectTriggers()

    .filter(t => t.getHandlerFunction() === “情報を取得する”)

    .forEach(t => ScriptApp.deleteTrigger(t));

  ScriptApp.newTrigger(“情報を取得する”)

    .timeBased()

    .atHour(9)

    .everyDays(1)

    .create();

  Logger.log(“トリガー作成完了:毎日9時に実行”);

}

// ============================================================

// テスト実行(キャッシュクリアして強制再取得)

// ============================================================

function テスト実行() {

  CacheService.getScriptCache().removeAll([“補助金データv7”, “助成金データv3”]);

  Logger.log(“テスト開始(キャッシュクリア済み)…”);

  情報を取得する();

  Logger.log(“テスト完了”);

}