PCの定期ジョブが丸ごと止まったことをPCの外で検知する(Apps Script心拍・dead-man switch)
PC上の見張り番はPCと一緒に死ぬ。各ジョブがApps Scriptへ心拍を打ち、来ない心拍を外側の時間トリガーが鳴らす構成と、日付書式で監視が永久に赤くなる等の実際の落とし穴
約5.1万トークンの節約 (API料金換算で約77円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「PCの定期ジョブが丸ごと止まったことをPCの外で検知する(Apps Script心拍・dead-man switch)」は、業務自動化カテゴリのAI指示書(MDファイル)です。PC上の見張り番はPCと一緒に死ぬ。各ジョブがApps Scriptへ心拍を打ち、来ない心拍を外側の時間トリガーが鳴らす構成と、日付書式で監視が永久に赤くなる等の実際の落とし穴この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約5.1万トークン(API料金換算で約77円)・85%のトークンを節約できます。
- カテゴリ
- 業務自動化
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約6万トークン
- この巻物使用時
- 約9,000トークン
- 節約量
- 約5.1万トークン (約77円)
- 更新日
- 2026-10-12
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/pc-pc-apps-script-dead-man-switch/raw を読み込んで、この指示書どおりに実装して"
中身
PC の定期ジョブが「丸ごと止まった」ことを PC の外で検知する(Apps Script 心拍・dead-man switch)
何の問題を解くか
Windows タスクスケジューラ/cron で毎日動く集計・点検ジョブがあり、PC 上に見張り番(watchdog)も置いている。 しかし PC 自体が落ちる・スリープする・ログインが切れると、見張り番も一緒に止まるので「止まった」を誰も報告しない。 沈黙は「正常」と見分けがつかない。
受け取り手を PC の外(Google Apps Script のウェブアプリ+時間トリガー)に置き、 各ジョブが心拍を打ち、来るはずの心拍が来なければ外側が鳴らす構成にする。
構成
各ジョブ(node 等) ──POST action=heartbeat──▶ Apps Script ウェブアプリ ──▶ シート「heartbeat」(job×slot ごと最新1行)
▲
時間トリガー checkHeartbeats (例 10:00 / 19:00) ──NG のみ──▶ チャット通知(Webhook)
Apps Script 側
- 保存は「job×slot ごとに最新1行の上書き」。追記で伸ばさない(判定が最新行だけで済み、シートが肥大しない)。
列:
job, slot, at, status, summary, checks。書き込みはLockService.getScriptLock()で排他。 - status は
started/ok/failedの3値。startedが無いと「起動して落ちた」と「起動していない」を区別できない。 - 期待表を定数で持つ:
{job, slot, due:'HH:MM'}の配列。現在時刻(必ずUtilities.formatDate(d,'Asia/Tokyo',…)で固定の TZ に落とす)が due を過ぎたものだけ判定し、missing(行なし)/stale(日付が今日でない)/failed/incomplete(started のまま)に分ける。判定関数はシートにも通知にも触らない純関数にする。 - 通知は NG のときだけ。毎朝1回だけ「監視稼働中: N job 正常」の1行を出すと、監視そのものの沈黙にも気付ける。
- Webhook の応答コードを必ず読む(
muteHttpExceptions:true、2xx 以外は失敗扱い。429 を成功と数えない)。 - 心拍の記録は例外を投げない(
{ok:false,error}を返すだけ)。監視の失敗で本業のジョブを止めない。 - トリガー設置関数は UI 非依存で作り、ウェブアプリのアクションからも呼べるようにする。
ジョブ側(クライアント)
export async function sendHeartbeat({ job, slot, status, summary = '', checks = null, call = gatewayCall }) {
try { const r = await call('heartbeat', { job, slot, status, summary, checks }); return { ok: r?.ok !== false, response: r }; }
catch (e) { return { ok: false, error: e.message }; } // 投げない
}
開始時に started、終了時(finally)に ok / failed。致命的エラーで抜ける経路でも failed を打つ。
落とし穴(実際に踏んだもの)
- シートの日付セルをそのまま返すと書式が壊れる。
String(cell)は"Sat Oct 10 2026 20:47:06 GMT+0900 (…)"になり、 受け手がslice(0,10)で日付を取ると心拍が届いても毎回 stale = 監視が永久に赤になる。 返す側で ISO(yyyy-MM-dd'T'HH:mm:ssXXX)に揃え、受ける側も書式を仮定せずDate.parseで解釈し、 解釈できない値はunreadableとして正常にも古いにも倒さない。テストは実応答の文字列そのままで書く。 - 監視自身の心拍を「NG を見つけたら failed」にしない。それをすると「監視が止まった」と「監視が異常を見つけた」が同じ表示になる。監視の心拍は「動いたか」、検出結果は summary に分ける。
- 期待表は2か所(GAS とクライアント)に置くなら、一致をテストで固定(片方だけ直すと黙ってずれる)。
- デプロイ反映は「新しく足したキーが応答に入ったか」で判定(
getBuildInfoにheartbeat:trueを足す)。成功表示や応答長は当てにならない。 - due 時刻は「ジョブの実所要時間」の後ろに置く。ブラウザ操作で数十分かかる後段ジョブを開始予定時刻+30分にすると毎日誤報になる。
「動いた」の先: 正しさと再発防止も同じ形で足す
- 心拍は「動いた」しか言えない。出力の妥当性(例: 市場最安が自社平均の3倍超、未取得が50%超、提案0件)を純関数で検査し、NG なら status を failed にする。判定不能は
nullとして NG(false)と分ける。 - 過去事故を「1事故1ファイル」のプローブ(
{id, incidentDate, source, what, probe(ctx)→{ok,evidence}})にして毎日回す。 プローブは「鳴る例」だけでなく「クリーンなリポジトリで鳴らない」こともテストする。コメント行や自分自身のソースに正規表現が当たる誤検知は、実リポジトリで回すまで見えない。 テスト用のコンテキストが注入(readRepo等の差し替え)を本当に効かせているかも確認する。効いていないと「鳴る例」のテストが実ファイルを読み、異常検出が丸ごと未検証になる。
よくある質問
+「PCの定期ジョブが丸ごと止まったことをPCの外で検知する(Apps Script心拍・dead-man switch)」とは何ですか?
PC上の見張り番はPCと一緒に死ぬ。各ジョブがApps Scriptへ心拍を打ち、来ない心拍を外側の時間トリガーが鳴らす構成と、日付書式で監視が永久に赤くなる等の実際の落とし穴
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約6万トークンかかりますが、この巻物を使えば約9,000トークンで済みます。差し引き約5.1万トークン(API料金換算で約77円)・85%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
Google Meet 自動参加&動画配信Bot 開発指示書
指定した時刻に Google Meet へ自動参加し、動画を再生しながら画面共有する Bot を、Claude Code に一発で作らせる開発指示 MD。朝会の定例動画配信・ウェビナーの自動放送に。
受信メール添付を案件フォルダへ自動取込するパイプライン
メールを読むアプリとドライブに書くアプリが別、という現実的な構成で顧客メールの添付を案件フォルダへ無人保存する設計。権限追加を避ける理由、実行時間制限下の予算3本立て、二重の重複防止、base64url/行数上限/変換判定などの実装罠、案件と顧客のマッチング、名寄せは候補提示+人の承認にする型まで。
Gmail 自動仕分け&返信ドラフト生成MD
受信メールを AI が分類 (要返信/情報/営業/スパム) してラベル付けし、要返信メールには返信ドラフトまで自動生成する仕組みを作らせる指示書。DWD (ドメイン全体委任) 設定手順込み。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア