結論: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での通知の仕組み(全体構成)
- 案件一覧のRSSフィードを定期的にGASでチェックする
- 前回チェック時と比較して、新しい案件だけを抽出する
- 新着があればSlackに通知を送る
- 通知済みの案件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;
}設置手順
- 通知したいクラウドソーシングサイトの案件カテゴリのRSSフィードURLを確認する(提供されていない場合はこの方法は使えません)
- SlackでIncoming Webhookを発行し、URLを
SLACK_WEBHOOK_URLに設定する - スプレッドシートの拡張機能からGASエディタを開き、上記コードを貼り付ける
- トリガー(時計アイコン)から
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とスプレッドシートで二重管理させない設計についてまとめます。
