Apple公式で、iPhoneの認定整備済製品を購入しました。
少し前のモデルになりますが、新品より安く買えますし、1年間の製品保証もついているので、その他の中古品より安心して買えます。
ただ、台数が限られていますし、欲しい品が常に販売されているわけでもないので、購入のタイミングが難しいところ。
そこで、入荷待ちしている品名を指定し、その製品がアップされたら(製品名のリンクが存在したら)slackに通知を飛ばすことで、無事に欲しかったものを購入できました。
その際に使ったコードを公開します。
用意しておくもの
- slack(任意のチャンネル)
- Googleスプレッドシート
手順
通知用チャンネル作成
最初に、使っているslackの任意のチャンネルで、webhook URLを取得します。
今回は、新しいチャンネルを作成しました。既にあるチャンネルを使う場合は、「Webhook URLの取得」に飛んでOKです。
slack画面の左メニューから、「+チャンネルを追加する」>「新しいチャンネルを作成する」を選択します。

任意のチャンネル名を付けます。「通知テスト」としました。
可視性については、どちらでも良いですが、自分しか使わないので「プライベート」で作りました。

ユーザーの追加は「後でする」として良いです。

新しいチャンネル「通知テスト」ができました。

Webhook URLの取得
Slack APIページを開きます。
https://api.slack.com/apps
「Create New App」をクリックします。

「From scratch」を選択します。

App Name に任意の名前(今回は「通知テストWebhook」)を記入し、使っているワークスペースを選択します。
記入が済んだら「Create App」をクリックします。

左メニューの「Incoming Webhooks」をクリックします。

「Activate Incoming Webhooks」をONにします。

左メニューで「App Home」をクリックします。

「Your App’s Presence in Slack」で「App Display Name」を「Edit」とします。

「Display Name (Bot Name)」はSlack上で表示される名前です。チャンネルに投稿したときに表示されるので、分かりやすい名前にしておきます。今回は「通知くん」としました。
「Default Username」は内部で使われる名前です。これも何でもよいですし、Display Nameと同じで構わないのですが、一応半角英数として「notify-test-bot」としました。
入力が終わったら「Add」を選択します。

元の画面に戻ると「Always Show Bot as Online」をONにできるようになるので、やっておきます。

左メニューで「Install App」を選択します。

「Install to Workspace」をクリックします。

Webhook用のチャンネルで、設定したチャンネルを選択します。

「許可する」をクリックします。

左メニューで「Install to Workspace」を選択します。

「Webhook URL」が表示されています。
「Copy」をクリックすると、クリップボードにコピーされます。

Googleスプレッドシート作成
新規のGoogleスプレッドシートを作成します。
ファイル名は「更新チェック」としました。

更新をチェックしたいページのURLを取得します。
今回はAppleの認定整備済製品からiPadのページを使います。アドレスバーの内容をコピーしておきます。


作成したスプレッドシートのB1セルに、対象のURLをペーストします。
B2セルには、検索する文字列を入力します。今回は11インチのiPadを探すことにしました。
カンマ区切りで複数キーワードを検索することができます。「11 iPad」で検索しても「11インチiPad」は検出されません。表記のゆれに対応できるように、いくつか候補を入力しておくと良いと思います。
「Air」や「Pro」などの語句を追加することで、対象を狭めることができます。

GASスクリプト設定
「拡張機能」>「Apps Script」と選択します。

「無題のプロジェクト」となっているところを「更新チェック」と変えます。

元から入力されていた
function myFunction() {
}
を削除し、以下のコードを貼り付けます。冒頭の
const SLACK_WEBHOOK_URL = “https://hooks.slack.com/services/XXX”;
の ”” ”” の間を、さきほど取得したWebhook URLに書き換えてください。
// ===== webhook設定 =====
const SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXX";
// ===== 営業時間設定 =====
const BUSINESS_START_HOUR = 9; // 開始(9時)
const BUSINESS_END_HOUR = 18; // 終了(18時)※18:00ちょうどは含まない
function webcheck() {
// ---- 営業時間チェック ----
if (!isBusinessTime()) {
return; // 営業時間外は何もしない
}
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const targetUrl = sheet.getRange("B1").getValue();
const keywordCell = sheet.getRange("B2").getValue();
// URL または 検索語が空なら実行しない
if (!targetUrl || !keywordCell) {
return;
}
// 複数キーワード対応(カンマ区切り)
const keywords = keywordCell.split(",").map(k => k.trim()).filter(Boolean);
const props = PropertiesService.getScriptProperties();
const notifiedKey = `notified_${keywords.join("_")}`;
const html = UrlFetchApp.fetch(targetUrl, {
muteHttpExceptions: true,
followRedirects: true,
}).getContentText();
// キーワード OR 判定 + 商品リンク存在チェック
const found =
keywords.some(k => html.includes(k)) &&
html.includes("/jp/shop/product/");
const alreadyNotified = props.getProperty(notifiedKey) === "true";
// 初回検知のみ通知
if (found && !alreadyNotified) {
const message =
`*監視ページに対象製品が掲載されました!*\n` +
`対象: ${keywords.join(" / ")}\n` +
`${targetUrl}`;
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: "post",
contentType: "application/json",
payload: JSON.stringify({ text: message })
});
props.setProperty(notifiedKey, "true");
}
// 掲載終了 → フラグ解除(再掲載に備える)
if (!found && alreadyNotified) {
props.deleteProperty(notifiedKey);
}
}
/**
* 平日・営業時間内かどうか判定
*/
function isBusinessTime() {
const now = new Date();
const day = now.getDay(); // 0=日, 6=土
const hour = now.getHours();
// 土日除外
if (day === 0 || day === 6) {
return false;
}
// 営業時間外
if (hour < BUSINESS_START_HOUR || hour >= BUSINESS_END_HOUR) {
return false;
}
return true;
}
一旦保存します。

左メニューから「トリガー」を選択します。

「新しいトリガーを作成します」をクリックします。

各パラメータを設定します。今回の設定は、以下のようにしました。
時間の間隔はお好みで変更してください。
設定が終わったら「保存」をクリックします。
- 実行する関数:webcheck
- 実行するデプロイ:Head
- イベントのソース:時間主導型
- 時間ベースノトリガーのタイプ:分ベースのタイマー
- 時間の間隔:15分おき
- エラー通知設定:1週間おき

「Google hasn’t verified this app」と出てくると思うので、左下の「Advanced」をクリックします。
下に「Continue only if you understand the risks and trust the developer」の文字と、自分のGoogleアカウント、それに「Go to 更新チェック (unsafe)」の文字が表示されるので、「Go to 更新チェック (unsafe)」の文字を押下します。

「Select what 更新チェック can access」で「Select all」にチェックし、「Continue」とします。

トリガーが設定されるので、あとは実行されるのを待ちます。

通知結果
トリガーでスクリプトを実行し、対象リンクが監視対象ページに存在すれば、slackに通知がきます。
同じ検索語句へのリンクが存在している間は、複数回通知しないようになっていますが、掲載を下げたあとに再度掲載されたら、また通知されるようになっています。
監視不要になったら、トリガーは解除・削除しておくことをおすすめします。



コメント