社内ツール自動化

「あの作業、まだ手動ですか?」非エンジニア向けGAS×Slack連携で作る社内ツール自動化チュートリアル

約14分で読めます
文字サイズ:
「あの作業、まだ手動ですか?」非エンジニア向けGAS×Slack連携で作る社内ツール自動化チュートリアル
目次

この記事の要点

  • SaaS連携とAI活用による定型業務の自動化戦略
  • 「SaaSパラドックス」を避け、真の業務効率化を実現する思考法
  • 非IT部門でも実践できる、持続可能な自動化のロードマップと運用体制

毎日の業務の始まり。スプレッドシートを開き、今日が期限のタスクや契約更新日を目視で探し、該当する担当者にSlackでメンションを送る。この作業、1回あたりは15分程度かもしれません。しかし、1ヶ月で約5時間、1年で60時間もの貴重なリソースが「単なる転記と通知」に奪われています。

「自動化ツールを導入したい」と上司に相談しても、「予算がない」「費用対効果が見えない」と却下されるケースは珍しくありません。世の中には優れたSaaS(Software as a Service)が溢れていますが、現場の「ちょっとした不便」を解消するためだけに、月額数万円のコストと数ヶ月の導入期間をかけるのは現実的ではないのです。

こんな課題に直面したとき、どう解決しますか?

本記事では、プログラミング未経験者でも取り組める、Google Apps Script(GAS)を用いた社内ツールの自作アプローチを解説します。システム統合の専門家の視点から言えば、最初から巨大なシステムを組むのではなく、こうした小さな自動化(マイクロオートメーション)から検証を始めるのが、失敗しない業務改善の鉄則です。

本チュートリアルのゴール:自動で「期限切れ」を教えてくれる秘書を作る

社内ツール自動化の第一歩として、本記事では「スプレッドシートの期限を管理し、該当するタスクがあればSlackに自動通知するツール」の作成を目標に設定します。

世間では「DX(デジタルトランスフォーメーション)推進には高機能な専用SaaSが必要だ」と謳われていますが、それは必ずしも正しくありません。むしろ、現場の業務フローが固まっていない状態で多機能なツールを導入すると、現場が混乱し、使われないままコストだけがかかる「負の遺産」になるリスクが高いのです。

なぜ『自作』の自動化ツールが必要なのか

「わざわざ自分で作らなくても、ZapierやMakeなどのノーコードツールを使えばいいのではないか?」

そう考える方もいるでしょう。確かにノーコードツールは直感的で便利です。しかし、無料プランでは実行回数に厳しい制限があったり、社内のセキュリティポリシーで外部サービスとの連携が禁止されていたりするケースが多々報告されています。

また、業務フローが少し変わっただけで、複雑に絡み合ったノーコードツールの設定を修正できず、結局「誰も触れないブラックボックス」と化してしまう失敗例も後を絶ちません。

Google Apps Script(GAS)を使えば、追加のシステム利用料はかかりません。すでに導入されているGoogleアカウントの権限内で完結するため、セキュリティ上の懸念も最小限に抑えられます。何より、自分の手でコードを書いて動かす経験は、「業務をどう論理的に組み立てるか」という根本的な思考力を鍛えてくれます。

完成イメージ:スプレッドシートの更新をSlackで受け取る

今回作成するのは、以下のようなシンプルかつ強力な仕組みです。

  1. スプレッドシートに「タスク名」「担当者」「期限」が入力されている。
  2. 毎日朝9時に、プログラムが自動でシートを確認する。
  3. 「今日が期限」のタスクを見つけたら、Slackの指定チャンネルに自動でアラートメッセージを送る。

一度この仕組みを作ってしまえば、あなたは二度と「期限切れのチェック漏れ」に怯える必要はありません。自動化された秘書が、文句一つ言わずに毎日チェックを行ってくれるからです。

ステップ0:環境構築と事前の準備

開発を始める前に、必要な環境を整えましょう。この準備段階こそが、後々のスムーズな開発を左右します。

Googleアカウントの確認

まずは、普段業務で使用しているGoogleアカウントにログインしていることを確認してください。個人の無料アカウントでもGASは動きますが、社内のデータを扱う場合は、必ず会社のGoogle Workspaceアカウントを使用することがセキュリティ上の大原則です。

Slack Webhook URLの取得手順

外部ツール(今回はGAS)からSlackにメッセージを送るためには、「Incoming Webhook(インカミング・ウェブフック)」という仕組みを使います。これは、Slackが用意している「メッセージを受け取るための専用の窓口(URL)」のようなものです。

エンジニアではない方が最も躓きやすいのが、この外部連携の設定です。以下の手順で慎重に進めてください。

  1. Slackのワークスペースメニューから「App」または「アプリ」を選択します。
  2. 検索窓で「Incoming WebHooks」と検索し、アプリをワークスペースに追加します。
  3. メッセージを送信したいチャンネル(例:#task-alert)を選択し、「Incoming Webhook インテグレーションの追加」をクリックします。
  4. 画面に表示される https://hooks.slack.com/services/... から始まる長いURLをコピーします。

このURLは、あなたのSlackチャンネルにメッセージを書き込むための「合鍵」です。絶対に公開の場(インターネット上の掲示板や、公開設定のドキュメント)に貼り付けないよう注意してください。

練習用スプレッドシートの作成

次に、データの読み取り元となるスプレッドシートを作成します。
新規スプレッドシートを作成し、以下のように1行目にヘッダー(見出し)を入力してください。

  • A列:タスク名
  • B列:担当者
  • C列:期限(日付形式)
  • D列:ステータス

2行目以降に、テスト用のデータを2〜3件入力しておきましょう。その際、少なくとも1件は「C列の期限」を「今日の日付」にしておいてください。これが後でプログラムが正しく動くかどうかのテストになります。

ステップ1:GASエディタを開いて「Hello World」を表示する

ステップ0:環境構築と事前の準備 - Section Image

準備が整ったら、いよいよプログラミングの世界に入ります。最初は難しく感じるかもしれませんが、手順通りに進めれば必ず動きます。

スクリプトエディタの起動方法

先ほど作成したスプレッドシートのメニューバーから、「拡張機能」>「Apps Script」をクリックします。
すると、新しいタブが開き、「無題のプロジェクト」という画面が表示されます。これがGASのコードを書くためのエディタ(作業部屋)です。

画面には最初から以下のようなコードが書かれています。

function myFunction() {
  
}

これは「myFunctionという名前の機能(関数)を作りますよ」という宣言です。

初めてのコード入力と実行

まずは、プログラムが正常に動いているかを確認するための「テスト送信」を行います。以下のコードに書き換えてください。

function testRun() {
  // console.logは、裏側でこっそりメモを残すための機能です
  console.log("Hello World! 自動化の第一歩です。");
}

書き換えたら、画面上部の「フロッピーディスクのアイコン(プロジェクトを保存)」をクリックし、その右にある「実行」ボタンを押します。

承認画面(権限許可)の突破方法

初めて「実行」ボタンを押したとき、多くの人がここでパニックに陥ります。画面に「承認が必要です」というポップアップが表示されるからです。

さらに「権限を確認」を進めると、「このアプリは Google の確認を受けていません」という赤い警告画面が出現します。英語の警告画面が出るとヒヤッとしますよね。

しかし、焦らないでください。Googleは悪意のある第三者のスクリプトからユーザーを守るためにこの警告を出しています。今回は「あなた自身が書いたコード」を実行しようとしているため、全く危険はありません。

以下の手順で突破します:

  1. 左下の「詳細」という小さな文字をクリックします。
  2. 一番下に表示される「(安全ではないページ)に移動」をクリックします。
  3. 「許可」ボタンをクリックします。

許可が完了すると、画面下部の「実行ログ」に Hello World! 自動化の第一歩です。 と表示されるはずです。これで、あなたが書いたプログラムがGoogleのサーバー上で無事に動いたことになります。

ステップ2:スプレッドシートから「特定の条件」でデータを抽出する

プログラムが動くことを確認したら、自動化の心臓部である「データの読み取り」と「条件分岐」を実装します。

シートの情報を取得する基本コード

スプレッドシートに書かれたデータをプログラム側で扱うためのコードを書きます。先ほどの testRun 関数は消して、以下のように書き換えてください。

function checkDeadline() {
  // 1. 今開いているスプレッドシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  
  // 2. データが入力されている範囲をすべて取得
  // getValue(単数)ではなく、getValues(複数)を使うのがポイントです
  const data = sheet.getDataRange().getValues();
  
  // 確認のため、取得したデータをログに表示
  console.log(data);
}

ここで重要なのは、getValues() という命令です。これにより、シートのデータが「配列」という形式(ロッカーのようにデータが連なった状態)で一括取得されます。実行すると、ログにシートの中身が表示されるはずです。

if文を使って『今日が期限』の行を見つける

次に、取得したデータの中から「期限が今日」のものだけを探し出します。

プログラミングにおいて、日付の比較は初心者が最もつまずきやすい落とし穴です。スプレッドシート上の日付と、プログラムが認識する「今日」は、そのままでは形が違うため「一致しない」と判定されてしまいます。

これを解決するために、日付を「2025/10/01」のような「文字列(テキスト)」に変換してから比較するというテクニックを使います。

function checkDeadline() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  
  // 今日の日付を取得し、「yyyy/MM/dd」の形式に変換する
  const today = new Date();
  const todayStr = Utilities.formatDate(today, "JST", "yyyy/MM/dd");
  
  // 1行目は見出し(ヘッダー)なので、2行目(インデックス番号1)から順番に確認する
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const taskName = row[0]; // A列(タスク名)
    const pic = row[1];      // B列(担当者)
    const deadline = row[2]; // C列(期限)
    
    // 期限の列が空欄でなければ処理を行う
    if (deadline !== "") {
      // スプレッドシートの日付も同じ形式に変換する
      const deadlineStr = Utilities.formatDate(new Date(deadline), "JST", "yyyy/MM/dd");
      
      // もし「期限」と「今日」が一致したら
      if (deadlineStr === todayStr) {
        console.log("期限が今日のタスクを発見:" + taskName);
      }
    }
  }
}

このコードの for 文は、上から下へ順番にシートの行を確認していく「見回り作業」です。そして if 文は、「もし〜だったら」という「ルールの設定」です。この2つを組み合わせることで、人間が目で見て探す作業を完全にプログラムに代替させることができます。

ステップ3:抽出したデータをSlackへ送信する

ステップ2:スプレッドシートから「特定の条件」でデータを抽出する - Section Image

データを見つけることができたら、次はその情報をSlackに飛ばします。

UrlFetchAppを使った外部送信の仕組み

ステップ0で取得したSlackのWebhook URLを使用します。以下のコードを、先ほどの checkDeadline 関数の上に追加してください。

// 取得したWebhook URLをここに貼り付けます(クォーテーションで囲むのを忘れずに)
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ';

// Slackにメッセージを送るための専用機能(関数)を作ります
function sendToSlack(message) {
  // Slackが読める形式(JSON)にデータを包むためのおまじないです
  const payload = {
    "text": message
  };
  
  const options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };
  
  // 実際にSlackの窓口へデータを投げ込みます
  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}

ここで登場する JSON.stringify という見慣れない言葉は、「手紙を封筒に入れて、郵便屋さんが運べる形にするためのおまじない」と考えてください。外部のシステムと通信する際の標準的なルールです。

メッセージを読みやすく整形する

先ほど作った checkDeadline 関数の中で、タスクを見つけた時にこの sendToSlack を呼び出すように書き換えます。

      // もし「期限」と「今日」が一致したら
      if (deadlineStr === todayStr) {
        // 送信するメッセージの文章を組み立てる
        const message = "⚠️ 【期限アラート】本日が期限のタスクがあります!\n" 
                      + "タスク名:" + taskName + "\n"
                      + "担当者:" + pic;
                      
        // 先ほど作った送信機能を使ってSlackに送る
        sendToSlack(message);
      }

\n は改行を表す記号です。これを入れることで、Slack上で見やすいレイアウトになります。

テスト実行し、Slackに「⚠️ 【期限アラート】...」というメッセージが届けば、システム間の連携は見事に成功です。あなたが書いたコードが、Googleの枠を超えてSlackを動かした瞬間です。

ステップ4:『毎日決まった時間』に自動実行させる(トリガー設定)

ステップ3:抽出したデータをSlackへ送信する - Section Image 3

今のままでは、エディタを開いて「実行」ボタンを押さないとプログラムが動きません。これでは手動で確認するのと大差ありません。ツールを真の意味で「自律」させるための設定を行います。

トリガー(時計マーク)の設定手順

GASには、指定した時間や条件でプログラムを自動的に動かす「トリガー」という機能が標準で備わっています。

  1. スクリプトエディタの左側メニューにある「時計のアイコン(トリガー)」をクリックします。
  2. 画面右下の「トリガーを追加」という青いボタンをクリックします。
  3. 以下の通りに設定します:
    • 実行する関数を選択:checkDeadline
    • 実行するデプロイを選択:Head(そのまま)
    • イベントのソースを選択:時間主導型
    • 時間ベースのトリガーのタイプを選択:日付ベースのタイマー
    • 時刻を選択:午前 9時〜10時
  4. 「保存」をクリックします。

これで設定は完了です。明日からは、あなたがパソコンを開いていなくても、Googleのサーバーが毎朝9時台に自動でスプレッドシートを確認し、該当するタスクがあればSlackに通知してくれます。

エラーが発生した時の通知設定

自動化ツールを運用する上で欠かせないのが、「ツールが止まっていないか」の監視です。
トリガー設定画面の右上にある「エラー通知設定(ベルのアイコン)」をクリックし、「毎日1回」または「すぐに通知」に設定しておきましょう。万が一、シートの構成が変更されてプログラムがエラーを起こした際、あなたのGmailに警告メールが届くようになります。

トラブルシューティング:動かない時にチェックすべき3つのポイント

プログラミングにエラーはつきものです。赤い文字でエラーメッセージが出ると焦ってしまいますが、デバッグ(バグ修正)の第一歩は「まずは落ち着いてログを見る」ことです。初心者が遭遇しやすい3つのポイントを解説します。

1. スペルミスと大文字・小文字の区別

JavaScript(GASのベースとなっている言語)は、大文字と小文字を厳密に区別します。
SpreadsheetAppspreadsheetapp と書いたり、getValues() の最後の s を忘れて getValue() にしてしまったりするミスが非常に多く報告されています。「関数が見つかりません(is not a function)」というエラーが出た場合は、まずスペルを疑ってください。

2. 日付のフォーマットエラー

スプレッドシートのC列(期限)に、日付ではない文字列(例:「未定」「来月中」など)が入力されていると、new Date(deadline) の部分でエラーが発生します。
運用上のルールとして、「期限列には必ず日付形式(yyyy/mm/dd)で入力する」ことをチーム内で徹底するか、コード側で「日付として認識できない場合はスキップする」というエラーハンドリングを追加する必要があります。

3. Slack Webhook URLの有効期限と権限

Slackに通知がいかない場合、GAS側の実行ログにはエラーが出ていないか確認してください。もしエラーがないのに通知が来ない場合、Webhook URLのコピーミスか、Slack側のアプリ設定で該当チャンネルへの投稿権限が付与されていない可能性があります。URLが正しくセットされているか、余計な空白が含まれていないかを再度確認しましょう。

次のステップ:社内自動化の達人になるための応用アイデア

お疲れ様でした。これであなたは「自らの手で業務を自動化する」という強力なスキルを手に入れました。今回作成したツールは非常にシンプルですが、この基礎さえ理解できれば、応用範囲は無限に広がります。

例えば、以下のような水平展開が考えられます。

  • フォーム回答をトリガーにする:Googleフォームにお客様からの問い合わせが入った瞬間、内容をSlackに通知し、同時にスプレッドシートに顧客管理台帳として記録する。
  • 他のGoogleサービスとの連携:スプレッドシートのデータをもとに、Googleカレンダーに自動で予定を登録する、あるいは特定の条件でGoogleドライブのフォルダを自動生成する。
  • AIとの連携:取得したデータを最新のAIモデル(ChatGPT APIなど)に渡し、長文のテキストを要約させてからSlackに通知する。(※API連携を利用する際の詳細な仕様や最新の料金体系については、OpenAI等の公式ドキュメントをご参照ください)

業務を「自動化しやすい形」に整理するコツは、現状のフローを細かく分解し、「人間が判断すべきこと」と「機械ができること(転記・検索・通知)」を明確に分けることです。

自社への適用を検討する際や、より高度な自動化アーキテクチャを設計する際は、最新動向を継続的にキャッチアップすることが不可欠です。技術の進化は早く、今日学んだ知識をベースに常に情報をアップデートしていく必要があります。

最新の自動化トレンドや、現場ですぐに使える実践的なスクリプト事例、AI統合のノウハウなどを継続的に学ぶには、専門的なメールマガジンでの情報収集も有効な手段です。定期的な情報収集の仕組みを整えることで、単なる「ツールの自作」から、組織全体の生産性を向上させる「業務設計のプロフェッショナル」へとステップアップできるはずです。

目の前にある小さな課題から、ぜひあなたの手で解決策を作り出してみてください。

「あの作業、まだ手動ですか?」非エンジニア向けGAS×Slack連携で作る社内ツール自動化チュートリアル - Conclusion Image

参考文献

  1. https://www.youtube.com/watch?v=d_iHRM1e-ZE
  2. https://www.sbbit.jp/article/cont1/184892
  3. https://app-liv.jp/articles/155925/
  4. https://biz.moneyforward.com/ai/basic/1364/
  5. https://note.com/chatgpt_nobdata/n/n3c6e4e17b6be
  6. https://help.openai.com/ja-jp/articles/6825453-chatgpt-release-notes
  7. https://www.youtube.com/@AIAIChatGPT-cj4sh/videos

コメント

コメントは1週間で消えます
コメントを読み込み中...