← logs

Google Apps Script と Discord Bot で出退勤記録を少し楽にした

2025年1月20日

Google Apps Script を簡易APIとして使い、Discord Bot から出退勤時刻を記録する小さな自動化を作った記録

tags: GAS, Discord, Automation

日々の出退勤記録を少し楽にするため、Google Apps Script と Discord Bot を使って小さな自動化を作った。

大きな業務システムを作る話ではない。 毎日やる小さな入力を、普段使っているDiscordから済ませられるようにした記録である。

やりたかったこと

もともとは、出勤時と退勤時に決まった記録を手で残していた。

作業としては単純だが、毎日やると地味に面倒である。

出勤する
時刻を記録する
退勤する
時刻を記録する

この流れを、Discord上の操作に寄せたかった。

目標は次の通りである。

Discordで出勤を記録する
Discordで退勤を記録する
記録先はGoogleスプレッドシートにする
なるべく小さいコードで作る

構成

構成はシンプルである。

Discord
  |
  | command / message
  v
Discord Bot
  |
  | HTTP request
  v
Google Apps Script Web App
  |
  v
Google Spreadsheet

Google Apps Scriptを簡易APIとして使う。 Discord Botは、出勤・退勤の操作を受け取り、GASのWeb App URLへリクエストを送る。

GAS側は受け取った内容をGoogleスプレッドシートに追記する。

Google Apps Script側

Google Apps Scriptでは、Web Appとして公開できるendpointを作る。

やることは単純である。

1. requestを受け取る
2. userやactionを読む
3. 現在時刻を作る
4. spreadsheetに追記する
5. 結果を返す

GASを使う利点は、Googleスプレッドシートとの相性が良いことだ。

小さな記録用途であれば、外部DBを立てなくても、スプレッドシートをそのまま保存先として使える。

Discord Bot側

Discord Bot側では、特定のcommandやmessageに反応してGASを呼ぶ。

たとえば、内部的には次のような流れである。

user:
  /work start

bot:
  GASへ出勤リクエストを送る
  記録できたらDiscordに結果を返す

退勤も同じである。

user:
  /work end

bot:
  GASへ退勤リクエストを送る
  記録できたらDiscordに結果を返す

ユーザーから見ると、Discordで操作しているだけである。 裏側ではBotがGASを叩き、GASがスプレッドシートへ記録する。

実装の流れ

実装は次の順番で進めた。

1. Googleスプレッドシートを用意する
2. Google Apps Scriptで記録用の関数を書く
3. GASをWeb Appとしてdeployする
4. Discord Developer PortalでBotを作る
5. BotからGASのURLへrequestを送る
6. Discord上で出勤・退勤を試す
7. スプレッドシートに記録されることを確認する

GASとDiscord Botは過去に触ったことがあったため、全体としては大きく詰まらなかった。

実装規模も小さく、だいたい200行程度で作れた。

確認したこと

最低限、次を確認した。

出勤操作で記録が増える
退勤操作で記録が増える
記録時刻が期待通りに入る
Discord側に成功メッセージが返る
失敗時に何らかのエラーが分かる

小さい自動化でも、失敗時の表示は重要である。

記録できていないのにBotだけが成功したように見えると、あとで困る。

良かったこと

一番良かったのは、日々の手作業が少し減ったことだった。

Discordから操作できる
記録先をスプレッドシートに集約できる
記録漏れに気づきやすい
小さいコードで実現できる

大きな自動化ではないが、毎日使う作業は少し楽になるだけでも効果がある。

注意点

GASのWeb App URLを雑に公開しない方がよい。

今回のような小さい仕組みでも、URLを知っている人が記録を追加できる構成にすると危ない。

最低限、次は考えた方がよい。

secret tokenをrequestに含める
GAS側でtokenを検証する
Discord user IDを記録する
想定外のactionを拒否する
失敗時のログを残す

また、出退勤のような記録は、実運用では扱いに注意が必要である。 個人情報や勤務情報に近いものを扱う場合は、保存先、アクセス権、ログの扱いを確認しておくべきである。

改善点

改善するとしたら、次のあたりである。

slash command化する
操作したDiscord user IDを厳密に紐づける
GAS側でtoken認証する
失敗時のretryを入れる
月次集計を自動化する
記録漏れを通知する

特に、slash command化すると操作が分かりやすくなる。

また、スプレッドシートに記録するだけでなく、月ごとの集計や抜け漏れチェックまで自動化できると、さらに使いやすくなる。

まとめ

Google Apps Script と Discord Bot を使うと、小さな業務自動化はかなり素早く作れる。

今回作ったものは、出勤・退勤の記録をDiscordから行い、Googleスプレッドシートへ保存する仕組みである。

大きなシステムではないが、毎日の繰り返し作業を少し減らせる。

こういう小さい自動化は、書いたコード量以上に効果が出ることがある。

コード

詳細なコードはGitHubに置いている。