Chatwork/Slackへ確定申告の期限やタスクをGASから毎日自動通知!業務効率化の決定版
導入:確定申告業務における時間管理の課題
確定申告の時期は、税理士や経理担当者にとって一年で最も忙しい期間の一つです。クライアントからの依頼、書類の収集・確認、申告書の作成、税務署への提出など、多岐にわたるタスクが山積します。これらのタスクにはそれぞれ期限があり、一つでも漏れてしまうと、クライアントへの信用の失墜やペナルティにつながる可能性があります。従来のタスク管理方法では、手作業でのリマインダー設定や、都度進捗確認に多くの時間を費やさざるを得ませんでした。この非効率性を解消し、確定申告業務の精度とスピードを向上させるために、Google Apps Script (GAS) を活用した自動通知システムの構築が有効な手段となります。本記事では、GASを用いてChatworkやSlackといったビジネスチャットツールに、確定申告の期限や未完了タスクを毎日自動で通知する方法を、初心者にも理解できるよう網羅的に解説します。
基礎知識:GAS、Chatwork API、Slack APIとは
この自動通知システムを理解するためには、まず基盤となる技術要素について把握しておく必要があります。
Google Apps Script (GAS) とは
Google Apps Script (GAS) は、Google Workspace (旧 G Suite) のアプリケーション(Gmail, Google スプレッドシート, Google ドライブなど)を連携させたり、カスタマイズしたりするための、JavaScriptをベースとしたクラウドベースのスクリプト言語です。GASの最大の特長は、特別な環境構築なしに、ブラウザ上でコードを記述し、実行できる点にあります。これにより、Google スプレッドシートで管理している確定申告のタスクリストをトリガーとして、ChatworkやSlackにメッセージを送信するといった、複雑な自動化処理を比較的容易に実現できます。
Chatwork APIとは
Chatwork APIは、Chatworkの機能を外部のアプリケーションから操作するためのインターフェースです。APIを利用することで、メッセージの送信、タスクの作成、情報取得などがプログラムから可能になります。確定申告のタスク通知では、GASからChatwork APIを呼び出し、指定したチャットルームにリマインダーメッセージを自動投稿するために使用します。
Slack APIとは
Slack APIも同様に、Slackの機能を外部から操作するためのインターフェースです。メッセージ送信、チャンネルへの投稿、ユーザー情報の取得など、多岐にわたる操作が可能です。GASからSlack APIを利用することで、Slackの特定のチャンネルに確定申告に関する通知を自動で配信できます。Chatwork APIと同様に、APIキーやトークンといった認証情報が必要となります。
詳細解説:GASによる自動通知システムの構築ステップ
ここからは、具体的なシステム構築の手順を詳細に解説していきます。Google スプレッドシートをタスク管理のハブとして使用し、GASがそれを読み取ってChatworkまたはSlackへ通知する流れを想定します。
ステップ1:タスク管理用Google スプレッドシートの準備
まず、確定申告のタスクを管理するためのGoogle スプレッドシートを作成します。最低限、以下の項目を設定することをお勧めします。
- タスク名: 具体的な作業内容(例:「〇〇社 決算書作成」「△△様 領収書確認」)
- 担当者: 作業を担当する人物
- 期限: タスクの完了期限(日付形式)
- ステータス: 未着手、進行中、完了などの状態
- 通知フラグ: 通知済みかどうかを示すフラグ(例:「通知済」「未通知」)
例えば、A列にタスク名、B列に担当者、C列に期限、D列にステータス、E列に通知フラグを配置します。期限列は日付形式で入力し、GASから日付比較が容易にできるように設定してください。
ステップ2:ChatworkまたはSlackのAPI設定
Chatwork API設定
Chatworkで通知を受け取るためには、APIトークンが必要です。Chatworkの「マイページ」→「API設定」からAPIトークンを発行します。発行されたトークンは、GASからChatwork APIを呼び出す際に必要になります。また、通知を送信したいチャットルームのIDも事前に確認しておきましょう。チャットルームIDは、ChatworkのURLに含まれる数値部分です(例: https://www.chatwork.com/#!ridXXX のXXXの部分)。
Slack API設定
Slackで通知を受け取るためには、Incoming Webhooksを利用するのが一般的です。Slackワークスペースの設定画面から「アプリ」→「カスタムインテグレーション」→「Incoming Webhooks」を選択し、通知を送信したいチャンネルを選択して設定します。設定が完了すると、ユニークなWebhook URLが発行されます。このURLをGASから利用してメッセージを送信します。
ステップ3:Google Apps Script (GAS) コードの作成
いよいよGASコードの作成です。Google スプレッドシートを開き、「拡張機能」→「Apps Script」からスクリプトエディタを開きます。以下に、ChatworkとSlackそれぞれへの通知を想定したサンプルコードの概要を示します。
Chatwork通知用GASコード例 (概念)
このコードは、スプレッドシートを読み込み、期限が今日または明日に迫っているタスク、またはステータスが「未着手」や「進行中」のタスクを抽出し、Chatwork API経由でメッセージを送信します。
function sendChatworkNotification() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("タスクリスト"); // シート名を指定
const data = sheet.getDataRange().getValues();
const today = new Date();
today.setHours(0, 0, 0, 0);
const tomorrow = new Date(today);
tomorrow.setDate(today.getDate() + 1);
let message = "【確定申告リマインダー】\n";
let tasksFound = false;
for (let i = 1; i < data.length; i++) { // ヘッダー行をスキップ
const row = data[i];
const taskName = row[0];
const deadline = new Date(row[2]); // 期限列
const status = row[3]; // ステータス列
const notified = row[4]; // 通知フラグ列
// 期限が今日か明日、またはステータスが未完了で、まだ通知していないタスク
if ((deadline.getTime() === today.getTime() || deadline.getTime() === tomorrow.getTime() || status !== "完了") && notified !== "通知済") {
message += `- ${taskName} (期限: ${Utilities.formatDate(deadline, "JST", "yyyy/MM/dd")})\n`;
sheet.getRange(i + 1, 5).setValue("通知済"); // 通知済みに更新
tasksFound = true;
}
}
if (tasksFound) {
const chatworkApiKey = "YOUR_CHATWORK_API_KEY"; // 実際のAPIキーに置き換え
const roomId = "YOUR_ROOM_ID"; // 実際のチャットルームIDに置き換え
const url = `https://api.chatwork.com/v2/rooms/${roomId}/messages`;
const options = {
"method": "post",
"headers": {
"X-ChatWorkToken": chatworkApiKey
},
"payload": {
"body": message
}
};
UrlFetchApp.fetch(url, options);
sheet.getRange(1, 5, sheet.getLastRow(), 1).setValue("未通知"); // 通知済みのフラグをリセット(必要に応じて)
}
}
注意点: 上記コードは概念を示すものであり、実際のAPIキー、チャットルームID、シート名、列番号などはご自身の環境に合わせて修正が必要です。また、エラーハンドリングや、通知済みのフラグのリセットロジックは、運用に合わせて調整してください。
Slack通知用GASコード例 (概念)
Slackの場合は、Incoming Webhooks URLを利用します。
function sendSlackNotification() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("タスクリスト"); // シート名を指定
const data = sheet.getDataRange().getValues();
const today = new Date();
today.setHours(0, 0, 0, 0);
const tomorrow = new Date(today);
tomorrow.setDate(today.getDate() + 1);
let taskDetails = [];
for (let i = 1; i < data.length; i++) { // ヘッダー行をスキップ
const row = data[i];
const taskName = row[0];
const deadline = new Date(row[2]); // 期限列
const status = row[3]; // ステータス列
const notified = row[4]; // 通知フラグ列
// 期限が今日か明日、またはステータスが未完了で、まだ通知していないタスク
if ((deadline.getTime() === today.getTime() || deadline.getTime() === tomorrow.getTime() || status !== "完了") && notified !== "通知済") {
taskDetails.push(`- *${taskName}* (期限: ${Utilities.formatDate(deadline, "JST", "yyyy/MM/dd")})`);
sheet.getRange(i + 1, 5).setValue("通知済"); // 通知済みに更新
}
}
if (taskDetails.length > 0) {
const slackWebhookUrl = "YOUR_SLACK_WEBHOOK_URL"; // 実際のWebhook URLに置き換え
const message = {
"text": "【確定申告リマインダー】\n" + taskDetails.join("\n")
};
const options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(message)
};
UrlFetchApp.fetch(slackWebhookUrl, options);
sheet.getRange(1, 5, sheet.getLastRow(), 1).setValue("未通知"); // 通知済みのフラグをリセット(必要に応じて)
}
}
注意点: SlackのIncoming Webhooks URLは機密情報ですので、GASのスクリプトプロパティなどに保存し、コード内に直接記述しないように管理することを強く推奨します。
ステップ4:トリガーの設定
作成したGASコードを毎日自動実行させるために、「トリガー」を設定します。スクリプトエディタの左側にある時計アイコン(トリガー)をクリックし、「トリガーを追加」を選択します。関数に先ほど作成した `sendChatworkNotification` または `sendSlackNotification` を選択し、実行頻度を「時間ベースのタイマー」、間隔を「1日ごと」、時間帯を通知したい時刻(例:午前9時)に設定します。これにより、毎日指定した時間に自動で通知が送信されるようになります。
具体的なケーススタディ・計算例
ここでは、より具体的なシナリオを想定して、この自動通知システムの活用方法を見ていきましょう。
ケース1:複数クライアントの確定申告タスク管理
税理事務所では、数十社、場合によっては数百社のクライアントの確定申告を並行して進める必要があります。各クライアントごとに「資料請求」「記帳代行」「申告書作成」「税務署提出」といったタスクがあり、それぞれに期限が設定されています。Google スプレッドシートに全クライアント・全タスクを一覧化し、GASで毎日チェックすることで、「〇〇社様の申告書作成期限は明日です」「△△様、資料のご提出がまだです」といった具体的なリマインダーをChatworkやSlackの担当者宛に自動送信できます。これにより、担当者は個別のクライアントの状況を都度確認する手間が省け、対応漏れを防ぐことができます。
ケース2:期日管理の自動化(計算例)
例えば、あるタスクの期限が2024/03/15だとします。GASコード内の日付比較ロジックでは、以下のように判定されます。
- 実行日: 2024/03/14 午前9時 → 期限まであと1日なので、「明日」として通知対象となる。
- 実行日: 2024/03/15 午前9時 → 期限が本日なので、「今日」として通知対象となる。
- 実行日: 2024/03/16 午前9時 → 期限は過ぎているが、ステータスが「完了」になっていなければ、通知条件(
status !== "完了")によっては通知対象となる可能性がある。
このように、GASの Dateオブジェクトと `getTime()` メソッドを組み合わせることで、正確な日付比較に基づいた通知が可能です。さらに、通知フラグを設けることで、一度通知したタスクが再度通知されることを防ぎ、通知の冗長化を防ぐことができます。
ケース3:タスクの優先度付けと通知内容のカスタマイズ
スプレッドシートに「優先度」(高・中・低など)の列を追加し、GASコードで優先度が高いタスクを先に通知するようにロジックを組むことも可能です。また、通知メッセージの内容も、タスク名だけでなく、担当者名やクライアント名を含めるようにカスタマイズすることで、受け取った担当者がすぐに状況を把握できるように工夫できます。
メリットとデメリット
この自動通知システムには、多くのメリットがある一方で、考慮すべきデメリットも存在します。
メリット
- 業務効率の大幅な向上: 手作業でのリマインダー設定や進捗確認の時間が削減され、本来集中すべき業務に時間を割けるようになります。
- ミス・漏れの防止: 期限管理やタスクの抜け漏れをシステムが自動でチェックするため、ヒューマンエラーを大幅に削減できます。
- リアルタイムな情報共有: 確定申告の進捗状況が、関係者間でリアルタイムに共有されやすくなります。
- コスト削減: 高価なタスク管理ツールを導入する必要がなく、Google Workspaceの標準機能とGASで実現できるため、コストを抑えられます。
- 柔軟なカスタマイズ性: GASはJavaScriptベースであり、API連携も可能なため、自社の運用に合わせて細かくカスタマイズできます。
デメリット
- 初期設定の手間: GASのコード作成やAPI設定、トリガー設定など、初期段階での設定に一定の知識と時間が必要です。
- メンテナンスの必要性: GoogleやChatwork/Slackの仕様変更、または業務フローの変化に応じて、コードの修正やメンテナンスが必要になる場合があります。
- GASの実行上限: GASには実行時間や回数に上限があるため、非常に大規模なデータや頻繁すぎる実行には注意が必要です。
- セキュリティリスク: APIキーやWebhook URLなどの機密情報を適切に管理しない場合、情報漏洩のリスクがあります。
よくある間違い・注意点
このシステムを導入・運用する上で、よくある間違いや注意すべき点を以下にまとめました。
- 日付/時刻の扱い: GASで日付を扱う際は、タイムゾーン(日本標準時: JST)の設定や、時刻(午前0時)の扱いを正確に行うことが重要です。意図しない日付で通知されたり、されなかったりする原因となります。
- APIキー/Webhook URLの管理: これらはシステムへのアクセス権限を持つ重要な情報です。スクリプト内に直接記述するのではなく、スクリプトプロパティや環境変数などを利用して安全に管理しましょう。
- 通知フラグの管理不備: 「通知済」フラグの更新ロジックが不十分だと、同じタスクが何度も通知されてしまう可能性があります。タスク完了時や、定期的なリセット処理を適切に実装することが大切です。
- エラーハンドリングの欠如: API連携に失敗した場合や、スプレッドシートのデータに異常があった場合などに、スクリプトが停止してしまうことがあります。`try-catch`文などを利用して、エラー発生時の処理を記述しておくことが望ましいです。
- 過剰な通知: 通知条件が緩すぎると、毎日大量の通知が届き、かえって業務の妨げになることがあります。通知するタスクの範囲(例:期限まであと3日以内、ステータスが「未着手」のみなど)を明確に定義し、適切な頻度で通知するように調整しましょう。
よくある質問 (FAQ)
Q1: プログラミング経験がなくても作成できますか?
A1: 基本的なJavaScriptの知識があれば比較的容易ですが、全くの未経験ですと、コードの理解やデバッグに時間がかかる可能性があります。しかし、本記事で示したサンプルコードを参考に、コピペから始めて徐々に理解を深めていくことは可能です。また、Web上にはGASの学習リソースや、有償で開発を依頼できるサービスも存在します。
Q2: ChatworkとSlackの両方に同時に通知することは可能ですか?
A2: はい、可能です。GASのコード内で、Chatwork APIへのリクエストとSlack Webhook URLへのリクエストをそれぞれ記述することで、両方のツールに同時に通知を送信できます。
Q3: 通知するタスクの条件はどのようにカスタマイズできますか?
A3: GASコード内の条件分岐(`if`文)の部分を編集することで、通知するタスクの条件を自由にカスタマイズできます。例えば、「期限が今日から7日以内のタスク」や、「特定の担当者に割り当てられたタスクのみ」といった条件を追加・変更することが可能です。スプレッドシートに「優先度」や「カテゴリー」といった列を追加し、それを条件に含めることもできます。
Q4: 通知メッセージのフォーマットは変更できますか?
A4: はい、変更可能です。GASコード内のメッセージを作成している部分(文字列連結やテンプレートリテラルなど)を編集することで、通知メッセージの文面、表示形式(太字、色付けなど - SlackのBlock Kitなどを利用)、含める情報(担当者名、クライアント名など)を自由に変更できます。
まとめ:確定申告業務のDXを加速させる
確定申告の時期におけるタスク管理と期限超過は、多くの税理士事務所や経理部門にとって深刻な課題です。Google Apps Script (GAS) を活用し、ChatworkやSlackへ確定申告の期限やタスクを自動通知するシステムを構築することは、この課題に対する非常に有効な解決策となります。初期設定には学習コストや手間がかかるものの、一度構築してしまえば、業務効率の大幅な向上、ミスの削減、そしてチーム全体の生産性向上に大きく貢献します。今回解説した内容を参考に、ぜひこの自動化システムを導入し、確定申告業務のDX(デジタルトランスフォーメーション)を加速させてください。日々のルーチンワークから解放され、より付加価値の高い業務に集中できる未来が、そこにはあります。
#GAS #Chatwork #Slack #Tax Filing #Automation #Tax Season #Digital Tools
