GASでクラウドソーシングの新着案件をSlack通知(巡回時間ゼロに)

「見に行くの、やめました。」GASでクラウドソーシングの新着案件をSlackに自動通知する仕組みのアイキャッチ画像

結論:Google Apps Script(GAS)で案件一覧のRSSを定期チェックし、新着だけをSlackに通知する仕組みを作りました。導入後、案件を探すためにサイトを開く回数がほぼゼロになり、1日10〜15分の巡回時間が浮きました。

この記事でわかること

  • GASでクラウドソーシングの新着案件をSlack通知する仕組みの全体設計
  • そのまま使えるコード(RSS取得→重複除外→Slack通知)
  • 導入前後の時間比較
  • つまずきやすいポイントと対処法

前回の記事では、このブログでNotion・スプレッドシート・GASの3つを使って副業・フリーランスの業務を自動化していく方針を宣言しました。今回はその1本目、GASでの「受注管理」の自動化です。

案件チェックにかかっていた時間の実測

項目導入前
サイトを開く回数/日3〜4回
1回あたりの確認時間約3分
1日の合計時間10〜15分
1ヶ月換算約5時間

しかも見に行っても新着がない日の方が多く、時間対効果が悪い作業でした。GAS×クラウドソーシングの新着案件通知を自動化することで、この時間をまるごと削減するのが今回のゴールです。

GASでの通知の仕組み(全体構成)

  1. 案件一覧のRSSフィードを定期的にGASでチェックする
  2. 前回チェック時と比較して、新しい案件だけを抽出する
  3. 新着があればSlackに通知を送る
  4. 通知済みの案件IDを記録して、重複通知を防ぐ

「通知済みかどうかの記録」を持たないと、チェックのたびに同じ案件を何度も通知してしまうので、ここが地味に重要なポイントです。今回はスプレッドシートに通知済みIDを溜めていく方式にしました。

コードの中身と設置手順

Slack側でIncoming Webhookを発行し、そのURLをGASに設定して使います。

const SLACK_WEBHOOK_URL = 'ここにSlackのIncoming Webhook URLを入れる';
const FEED_URL = 'ここに案件一覧のRSSフィードURLを入れる'; // 利用するクラウドソーシングサイトの案件カテゴリRSS
const SHEET_NAME = '通知済み案件';

function checkNewJobs() {
  const sheet = getOrCreateSheet_();
  const notifiedIds = new Set(sheet.getRange('A:A').getValues().flat());

  const xml = UrlFetchApp.fetch(FEED_URL).getContentText();
  const document = XmlService.parse(xml);
  const items = document.getRootElement().getChild('channel').getChildren('item');

  const newJobs = [];

  items.forEach(item => {
    const link = item.getChildText('link');
    const title = item.getChildText('title');
    const id = link;

    if (!notifiedIds.has(id)) {
      newJobs.push({ id, title, link });
    }
  });

  if (newJobs.length === 0) return;

  newJobs.forEach(job => {
    postToSlack_(job);
    sheet.appendRow([job.id, job.title, new Date()]);
  });
}

function postToSlack_(job) {
  const payload = { text: `新着案件: <${job.link}|${job.title}>` };
  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  });
}

function getOrCreateSheet_() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) {
    sheet = ss.insertSheet(SHEET_NAME);
    sheet.appendRow(['案件ID(URL)', 'タイトル', '通知日時']);
  }
  return sheet;
}

設置手順

  1. 通知したいクラウドソーシングサイトの案件カテゴリのRSSフィードURLを確認する(提供されていない場合はこの方法は使えません)
  2. SlackでIncoming Webhookを発行し、URLをSLACK_WEBHOOK_URLに設定する
  3. スプレッドシートの拡張機能からGASエディタを開き、上記コードを貼り付ける
  4. トリガー(時計アイコン)からcheckNewJobsを「時間主導型・30分おき」などで設定する

まだ案件登録をしていない場合は、先に主要なクラウドソーシングサービスに登録しておくとこの仕組みがそのまま使えます。

Claude Codeでのデバッグ過程

実装時に一番つまずいたのは、RSSのitemの中身をパースする部分でした。フィードによってlinkタグの中身の形式が微妙に違うことがあり、最初はうまく取得できませんでした。Claude Codeで実際のフィードのXMLをそのまま読み込ませて、パース結果を1つずつ出力させながら、getChildTextで正しく値が取れているかを確認して直していきました。

導入前後の比較

項目導入前導入後
サイトを開く回数/日3〜4回ほぼ0回
案件チェックの時間/日10〜15分0分(通知が来た時だけ確認)
重複通知—0件(1週間運用)

まだ運用1週間なので、応募率や案件獲得数への効果はもう少し使ってから振り返ります。

よくある質問

RSSフィードがないサイトでも使えますか?

この方法はRSSフィード前提の仕組みなので、フィードを提供していないサイトには使えません。その場合はページを直接取得してパースする方法に変える必要があり、対象サイトの利用規約の確認も必要です。

通知の頻度は変えられますか?

トリガーの設定で30分おき・1時間おきなど自由に変更できます。頻度を上げすぎるとAPIの実行回数上限に注意が必要です。

複数のクラウドソーシングサイトを同時に通知できますか?

FEED_URLを配列にして、サイトごとにループ処理すれば対応できます。次回以降の記事で拡張する予定です。

次回は、Notionとスプレッドシートで二重管理させない設計についてまとめます。