集計が自動で動くようになっても、結果を見に行かなければ意味がありません。
ファイルに保存されているだけでは、結局開かなくなります。私は最初これで失敗しました。作った本人が3週間見ていませんでした。
そこで、結果のほうから届くようにしました。使っているのは2つです。
| 届け方 | 役割 |
|---|---|
| チャット(Slack) | 内容そのものを送る。あとから見返せる |
| Macの通知 | 要点だけ画面の隅に出す。今すぐ気づける |
この2つは役割が違うので、両方使っています。
Slackに送る:URLを1つもらうだけ
Slackに外部から書き込むには Incoming Webhook という仕組みを使います。プログラムからSlackに投稿するための、専用の宛先URLです。
受け取り方
- Slackの管理画面でアプリを新規作成する
- Incoming Webhook を有効にする
- 投稿したいチャンネルを選ぶ
https://hooks.slack.com/services/...というURLが発行される
無料プランで使えます。ここまで5分ほどです。
送る
あとは、そのURLに文章を投げるだけです。
curl -s -X POST -H 'Content-type: application/json' \
--data '{"text":"月末着地の集計が終わりました"}' \
"https://hooks.slack.com/services/..."
これだけでチャンネルに投稿されます。
⚠️ URLをプログラムに直接書かない
ここが最も注意すべき点です。
このURLを知っている人は、誰でもそのチャンネルに書き込めます。 パスワードと同じ扱いが必要です。
プログラムの中に直接書くと、次の事故が起きます。
- ファイルを人に渡したときに一緒に漏れる
- 手順を記事やチャットに貼ったときに写り込む
私は別ファイルに置いて、プログラムからは読むだけにしています。
# URLだけを書いたファイルを作る(本人以外読めないようにする)
echo 'https://hooks.slack.com/services/...' > ~/scripts/keiri/.slack_webhook
chmod 600 ~/scripts/keiri/.slack_webhook
プログラム側では、こう読みます。
HOOK=$(head -1 "$HOME/scripts/keiri/.slack_webhook")
curl -s -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"集計が終わりました\"}" "$HOOK"
💡 万一漏れても、SlackでそのWebhookを無効にすれば止まります。 作り直して、ファイルを差し替えるだけです。この復旧のしやすさも、ファイルに分けておく利点です。
集計結果をそのまま流す
実際には、決まった文言ではなく計算結果を本文にして送ります。
注意点が2つあります。改行と引用符です。 そのまま送ると形が崩れたり、送信自体が失敗します。
OUT="$HOME/scripts/keiri/着地予想.txt"
HOOK=$(head -1 "$HOME/scripts/keiri/.slack_webhook")
# 引用符を打ち消し、改行を \n に置き換える
BODY=$(sed 's/\\/\\\\/g; s/"/\\"/g' "$OUT" | awk 'BEGIN{ORS="\\n"}{print}')
curl -s -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"📊 *月末着地予想* ($(date '+%-m月%-d日'))\n\`\`\`${BODY}\`\`\`\"}" \
"$HOOK"
本文を ``` で囲むのがコツです。 Slackで等幅表示になり、桁が揃って読みやすくなります。数字を送るならこれをおすすめします。
Macの通知に出す
Slackは見返せますが、他の会話に流されます。 そこで、要点だけをMacの通知に出しています。
追加のソフトは不要です。Macに標準で入っているコマンドで出せます。
osascript -e 'display notification "止まっているチーム: 3 / 8" \
with title "週次チェック" subtitle "詳細はログを確認" sound name "Glass"'
| 部分 | 役割 |
|---|---|
display notification |
本文(ここを短くする) |
with title |
見出し |
subtitle |
補足 |
sound name |
音。省くと無音 |
本文には結果の要点を1行だけ入れます。 通知は数秒で消えるので、詳細を入れても読めません。
結果から1行だけ抜いて通知する
LINE=$(grep "全社合計" "$OUT" | tail -1)
[ -z "$LINE" ] && LINE="集計は終わりましたが、結果が読めませんでした"
osascript -e "display notification \"${LINE}\" \
with title \"月末着地予想\" sound name \"Glass\""
2行目を入れておいてください。 集計が途中で失敗したとき、通知が空になると「動かなかった」のか「気づかなかった」のか分からなくなります。
通知先は用途ごとに分ける
運用してみて分かったことです。
すべての通知を同じチャンネルに流すと、読まれなくなります。
私は分けています。
| 内容 | 宛先 | 頻度 |
|---|---|---|
| 経理の着地予想 | 経理用チャンネル | 月1回 |
| チームの停滞チェック | 別チャンネル | 週1回 |
Webhookのファイルも別々にしています。片方を止めたくなったときに、もう片方に影響しません。
⚠️ 通知は増やすほど価値が下がります。
「毎日届くが誰も読まない通知」は、無いのと同じです。読む気になる頻度に落としてください。
成功したときも通知するか
意見が分かれるところですが、私は成功時も通知しています。
理由は単純で、失敗したときだけ通知する設計だと、「通知が来ない」の意味が2通りになるからです。
- 正常に動いて、問題がなかった
- そもそも動いていなかった
この2つを区別できないのは危険です。月1回の集計なら、成功も通知して困りません。
ただし毎日動くものは話が別で、成功通知が毎日届くと読まなくなります。頻度によって決めてください。
まとめ
- 結果は見に行くのではなく、届くようにする
- Slackは Incoming Webhook にURLを投げるだけ。無料プランで足りる
- WebhookのURLはパスワード扱い。別ファイルに置いて読むだけにする
- 数字を送るときは
```で囲むと桁が揃う - Macの通知は
osascript。本文は要点1行だけ - 通知先は用途ごとに分ける。混ぜると読まれなくなる
- 月1回程度なら成功時も通知する。無音の意味が2通りになるのを避ける
通知を付けてから、仕組みが「使われるもの」に変わりました。自動化の最後の一手間は、結果を人の目の前に置くことです。


コメント