記事

Slack|全自動WFH健康狀況回報システムで業務効率化|Google Sheet×App Script連携

リモートワーク中の健康管理に悩む企業向けに、SlackとGoogle Sheet、App Scriptを活用した自動化システムを構築。手動入力の手間削減と正確な健康データ収集を実現し、業務効率を大幅に向上させます。

Slack|全自動WFH健康狀況回報システムで業務効率化|Google Sheet×App Script連携

本記事は AI による翻訳をもとに作成されています。表現が不自然な箇所がありましたら、ぜひコメントでお知らせください。

記事一覧


Slackで完全自動の在宅勤務社員健康状況報告システムを構築する

Slack Workflow と Google Sheet と App Script を組み合わせて効率アップ

Photo by [Stephen Phillips — Hostreviews.co.uk](https://unsplash.com/@hostreviews?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText){:target="_blank"}

Photo by Stephen Phillips — Hostreviews.co.uk

前書き

全面的なリモートワークに対応し、会社は全メンバーの健康状態を重視しています。毎日、体調の有無を報告し、People Operationsが一括で記録・管理します。

私たちの最適化前のフロー

  1. [自動化] Slack チャンネルで毎朝10時に健康フォームのリマインドメッセージを定時送信(最適化前の唯一の自動化部分)

  2. 従業員がリンクをクリックして Google フォームで健康状態を入力する

  3. データを Google Sheet に保存して回答を記録する

  4. [手動] People Operations は毎日退勤時間近くにリストを照合し、記入忘れの社員を抽出する

  5. [手動] Slack チャンネルで入力リマインダーを送信し、忘れた人を一人ずつタグ付けする

以上は弊社の健康報告追跡プロセスです。会社ごとに規模や運用方法が異なるため、本記事はあくまで最適化の例として、Slack Workflowの使用方法や基本的なApp Scriptの記述を学ぶためのものです。実際の運用はケースバイケースで対応してください。

問題点

  • Slackのコンテキストを離れてブラウザでGoogleフォームのページを開いて入力する必要があり、特にスマートフォンではさらに不便です。

  • Google Formはメールアドレスのみ自動入力でき、記入者の名前や部署情報は自動で追加できません。

  • 毎日の手動照合や手動タグ付けは非常に人手と時間がかかります。

解決策

これまでにいくつかの自動化を試してきましたが、このプロセスはデータソースが固定(社員リスト)、条件が単純、動作が定型的で、自動化に非常に適しています。最初に着手しなかったのは、良い入力方法が見つからなかったからです(実際には面白くて研究したいポイントがなかったため)。そのため放置していましたが、海総理のこの投稿を見て、Slack Workflowは定期メッセージ送信だけでなく、フォーム機能もあることに気づきました:

画像出典: [海総理](https://www.facebook.com/tzangms/posts/10157880898787657){:target="_blank"}

画像出典: 海総理

これで手がうずいてきた!

もし Slack Workflow Form とメッセージ送信の自動化を組み合わせれば、上記で述べたすべての課題を解決できるのではないかと考え、実装を始めました。

最適化後のフロー

まずは、最適化後のプロセスと結果を紹介します。

  1. [自動化] Slack チャンネルで毎朝10時に健康フォームのリマインドメッセージを定時送信する

  2. Google Form または Slack Workflow Form から健康に関する質問に回答する

  3. データはすべて Google Sheet に保存されます 回答記録

  4. People Operations は毎日退勤間近に「未記入リストを生成」ボタンをクリックします

  5. [自動化] App Scriptを使って従業員リストと記入リストを照合し、未記入リストを抽出する

  6. [自動化] 「生成&送信メッセージ」をクリックして未記入者へのリマインダーを自動送信&対象者を自動タグ付け

  7. お疲れ様でした!

効果

(個人予測)

  • 記入時間は従業員一人あたり毎日約30秒短縮できます。

  • People Operations はこの作業を毎日約20〜30分短縮できます。

動作の仕組み

App Script を使って Sheet を管理する。

  1. 外部から入力されたデータはすべて Responses シートに保存する

  2. App Script 関数を作成し、Responses のデータを記入日付ごとに各日のシートに振り分けます。該当の日付のシートがなければ新規作成します。シート名は日付を直接使用し、識別と利用を容易にします。

  3. 現在の日付のシートと従業員リストを照合し、未提出リストのシートデータを作成する

  4. 未記入リストのシートを読み込み、メッセージを作成して指定のSlackチャンネルに送信する

  • Slack APP API と連携して指定チャンネルから社員リストを自動取得する

  • メッセージ内容に Slack UID タグ <@UID> を使うことで、未提出のメンバーをタグ付けできます。

身分識別

Google Form と Slack の本人確認情報はメールアドレスで連携しているため、社員は必ず会社のメールアドレスで Google Form を記入し、Slack の個人情報にも会社のメールアドレスを登録してください。

作業を始める

問題、改善方法、成果の説明が終わったら、次は実装の段階です。一緒にこの自動化ケースを一歩ずつ完成させましょう。

記事が少し長いため、すでに理解している部分は飛ばしても構いませんし、完成した結果からコピーを作成して見ながら修正しつつ学んでも問題ありません。

完成結果フォーム: https://forms.gle/aqGDCELpAiMFFoyDA

完成結果 Google Sheet:

健康報告用の Google フォーム作成と回答を Google シートに連携する方法

手順は省略します。問題があれば直接 Google で検索してください。ここでは、健康報告フォームが既に作成および連携されていることを前提とします。

フォームで「Collect emails」にチェックを入れることを忘れないでください:

記入者のメールアドレスを収集し、後でリストと照合できるようにします。

どうやって返信を Google Sheet に連携するのか?

フォームの上部で「回答」タブに切り替え、「Google Sheet アイコン」をクリックしてください。

リンク先のシート名を変更する:

ここでは、リンクされたシート名を「Form Responses 1」から「Responses」に変更することをおすすめします。

Slack Workflow Form の入力フォーム作成

従来の Google Form の入力方法ができたので、まずは Slack での入力方法を追加しましょう。

Slack の任意のチャットウィンドウで「入力欄の下」にある「青い稲妻⚡️」をクリックしてください。

メニューの下にある「Search shortcuts」で「workflow」と入力し、「Open Workflow Builder」を選択してください。

ここにはあなたが作成または参加した Workflow が一覧表示されます。右上の「Create」をクリックして新しい Workflow を作成してください。

第一歩、workflow名を入力します(Workflow Builderのインターフェース表示用)

Workflow のトリガー方法で「Shortcut」を選択する

現在、Slack Workflow のトリガー時間点は合計で5種類あります:

  • Shortcut:手動で「青い稲妻⚡️」オプションをトリガーすると、workflow メニューに表示され、クリックすると workflow が開始されます。

  • New channel member:ターゲットチャンネルに新しいメンバーが参加したとき…(例:歓迎メッセージ)

  • Emojiリアクション:誰かがターゲットチャンネルのメッセージに指定の絵文字を押したとき…(重要なメッセージの既読確認に「XXX Emojiを押してください」と使えるかもしれません。これで誰が既読か分かります)

  • Scheduled date & time:スケジュール、指定した時間に…(例:定期的にリマインドメッセージを送信)

  • Webhook:外部Webhookのトリガーで、進んだ機能としてサードパーティや自分で構築したAPIと連携し、内部のワークフローをつなげることができます。

ここでは「Shortcut」を選択し、手動トリガーオプションを作成します。

この Workflow Shortcut を「どのチャンネルの入力欄」に追加するか選択し、「表示する名前」を入力してください。

*一つの workflow ショートカットは一つのチャンネルにのみ追加可能です

Shortcut 作成完了!ワークフローのステップ作成を開始し、「Add Step」をクリックしてステップを追加します。

「Send a form」ステップを選択する

Title :フォームタイトルを入力してください

Add a question :最初の質問のタイトルを入力してください(タイトルに問題番号を記載しても構いません 例:1., 2., 3.…)

質問タイプを選択してください

  • Short answer:単一行入力欄

  • Long answer:複数行入力欄

  • リストから選択:単一選択リスト

  • Select a person:同じワークスペース内のメンバーを選択してください

  • Select a channel or DM:同じワークスペース内のメンバー、グループDM、またはチャンネルを選択してください

「リストから選択」 の例:

  1. リスト項目を追加:新しいオプションを追加できます

  2. Default selection:デフォルト選択

  3. Make this required:この質問を必須にする

  1. Add Question:さらに質問を追加可能

  2. 右側の「↓」「⬆」で順序を調整、「✎」で展開して編集可能

  3. フォームの入力内容をチャンネルまたは特定のユーザーに送信するかどうかを選択できます

返信を送信する先として…を選択することもできます:

  • Person who clicked ….:このフォームをクリックした人(記入者と同じ)

  • Channel where workflow started:このワークフローが開始されたチャンネル

フォームが完成したら、「Save」をクリックしてステップを保存します。

*ここではフォームの入力内容を返送する設定を解除します。後続のステップでメッセージ内容をカスタマイズするためです。

Slack workflow form と Google Sheet を連携する

まだ Google Sheet アプリを Slack に追加していない場合は、先に こちらからアプリをインストール してください。

前のステップの続きで、「Add Step」をクリックして新しいステップを追加します。ここでは Workflow Builder の Google Sheets の「Add a spreadsheet row」ステップを選択します。

  1. まずは Google アカウントの認証を完了するために、「Connect account」をクリックします。

  2. Select a spreadsheet:対象の回答用 Google Sheet を選択してください。最初に作成した Google Form の Google Sheet を選んでください。

  3. Sheet:同上

  4. Column name:最初に値を入力したい列、ここではまず質問1を選択します

右下の「Insert Variable」をクリックし、「Response to 問題一…」を選択します。挿入後、左下の「Add Column」から他の列を追加し、同様に問題二、問題三を完成させます。

入力者のメールアドレス、「フォームを送信した人」を選択可能

挿入した変数をクリックし、「Email」を選択すると、入力者のメールアドレスが自動で挿入されます。

  • Mention (default):該当ユーザーをタグ付けし、Raw data は <@User ID> です。

  • Name:ユーザー名

  • Email:ユーザーのメール

Timestamp 欄は少し複雑なので、設定方法は後で補足します。まず「Save」をクリックして保存し、その後ページ右上の「Publish」を押してショートカットを公開してください。

公開成功のメッセージが表示されたら、Slack チャンネルに戻って試してみてください。

この時に稲妻アイコンをクリックすると、先ほど作成した Workflow フォームが表示され、クリックして入力できます。

左:パソコン 右:スマートフォン版

左:パソコン / 右:スマホ版

情報を入力して「Submit」を押し、正常に動作するかテストしてみましょう。

成功しました!しかし、Timestamp 列が空欄になっているのが確認できます。次のステップでこの問題を解決しましょう。

Slack workflow から記入時間を取得

Slack workflow には現在のタイムスタンプを表すグローバル変数がありません。少なくとも現時点では存在せず、reddit の要望投稿 のみ見つかりました。

最初、Column Value に =NOW() を入力しましたが、これだとすべての記録の時間が常に現在の時間になり、完全に間違っていました。

同様に reddit のこの記事 で紹介されたトリッキーな方法を使い、クリーンな Timestamp シートを作成します。シート内に1行のデータと列に =NOW() を置き、Update でセルを最新の状態に更新し、その後 Select で現在の Timestamp を取得します。

上図の構造のように、こちらをクリックして サンプルを見る

  • Row:IDのような役割で、「1」と直接設定します。後でSelect & Updateを設定するときに、データ行を指定するために使います。

  • Timestamp:設定値 =NOW() で常に現在の時間を表示するようにする

  • Value:Timestamp欄の更新時間をトリガーするための値で、中身は自由です。ここでは入力者のEmailを入れていますが、更新をトリガーできれば何でも構いません。

外部に見せる必要がないため、Sheet 上で右クリックして「シートを非表示」にできます。

Slack Workflow Builder に戻り、先ほど作成した workflow form を編集します。

「Add Step」をクリックしてステップを追加します:

下にスクロールして「Update a spreadsheet row」を選択してください

「Select a spreadsheet」で先ほどのシートを選び、「Sheet」では新しく作成した「Timestamp」シートを選択します。

「Choose a column to search」で「Row」を選択し、Define a cell value to find に「1」と入力します。

「Update these columns」「Column name」から「Value」を選択し、「Value」で「Insert variable」->「Person who submitted」->「Emailを選択」をクリックします。

「Save」をクリックして完了です!これで Sheet 内の timestamp 更新がトリガーされるようになりました。次は、それを読み取って使います。

編集ページに戻り、「Add Step」をもう一度クリックして新しいステップを追加します。今回は「Select a spreadsheet row」を選択し、Timestamp を読み取ります。

Search 部分は「Update a spreadsheet row」と同じで、「Save」を押します。

保存してステップ一覧ページに戻ると、マウスをステップに移動してドラッグで順序を変更できます。

順序を「Update a spreadsheet row」→「Select a spreadsheet」→「Add a spreadsheet row」に変更してください。

つまり:Updateでtimestampを更新 → Timestampを読み取る → 新しい行を追加するときに使用する。

「Add a spreadsheet row」で「Edit」をクリックして編集:

一番下までスクロールして左下の「Add Column」を押し、次に右下の「Insert a variable」をクリックし、「Select a spreadsheet」セクション内の「Timestamp」変数を選択して挿入します。

「Save」を押してステップを保存した後、リストページに戻り、右上の「Publish Change」をクリックして変更を公開します。

この時点で、workflow shortcut をもう一度テストして、timestamp が正常に書き込まれているか確認します。

成功!

Slack workflow form に返信確認を追加する

Google Form の回答と同様に、Slack Workflow Form でも可能です。

編集ステップページで「Add Step」をクリックして、もう一つステップを追加できます。

今回は「Send a message」を選択します。

「Send this message to」では「Person who submitted form」を選択してください。

メッセージ内容に順番に質問のタイトルを入力し、「Insert a variable」から「Response to 質問 XXX」を選択します。最後に「Timestamp」を挿入することも可能です。「Save」でステップを保存し、「Publish Changes」をクリックしてください。

また、「Send a message」を使って、記入結果を特定のチャンネルやDMに送信することもできます。

成功!

Slack workflow form の設定はここまででほぼ完了です。他の使い方は自由に組み合わせて活用してください。

Google Sheet と App Script!

次に、入力されたデータを処理するための App Script を作成します。

まず Google Sheet の上部ツールバーで「Tools」->「Script editor」を選択します。

左上の角をクリックして、プロジェクトに名前を付けることができます。

現在私たちは App Script の作成を始めることができます!App Script は Javascript をベースに設計されているため、Javascript のコードをそのまま使って Google Sheet のライブラリと連携できます。

Responses のデータを記入日ごとに各日のシートに振り分ける

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function formatData() {
  var bufferSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Responses') // 回答を保存するシート名
  
  var rows = bufferSheet.getDataRange().getValues();
  var fileds = [];
  var startDeleteIndex = -1;
  var deleteLength = 0;
  for(index in rows) {
    if (index == 0) {
      fileds = rows[index];
      continue;
    }

    var sheetName = rows[index][0].toLocaleDateString("en-US"); // 日付を文字列に変換、アメリカの日付形式 MM/DD/YYYY を使用
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); // MM/DD/YYYY のシートを取得
    if (sheet == null) { // なければ新規作成
      sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName, bufferSheet.getIndex());
      sheet.appendRow(fileds);
    }

    sheet.appendRow(rows[index]); // データを日付シートに追加
    if (startDeleteIndex == -1) {
      startDeleteIndex = +index + 1;
    }
    deleteLength += 1;
  }

  if (deleteLength > 0) {
    bufferSheet.deleteRows(startDeleteIndex, deleteLength); // 指定のシートに移動後、Responsesのデータを削除
  }
}

Code ブロックに上記のコードを貼り付け、「control」+「s」で保存してください。

次に、Sheet にトリガーボタンを追加します(ボタンは手動で押す必要があり、データが書き込まれた際に自動で分割されることはできません)。

  1. まず新しいシートを作成し、「未記入リスト」と名前を付けます。

  2. 上部ツールバーで「挿入」->「図形描画」を選択してください。

このインターフェースを使って、ボタンを作成します。

「保存して閉じる」後にボタンの調整や移動が可能;右上の「…」をクリックして「スクリプトを割り当て」を選択してください

「formatData」関数名を入力してください。

クリックして参加できるボタンで機能をお試しください

「Authorization Required」が表示された場合は、「Continue」をクリックして認証を完了してください。

認証の過程で「Google hasn’t verified this app」という表示が出ることがありますが、これは正常です。私たちが作成した App Script は Google の認証を受けていないためです。しかし、これは自分用に作成したものなので問題ありません。

左下の「Advanced」→「Go to Health Report (Responses) (unsafe)」をクリックできます。

「Allow」をクリックしてください

App Script 実行中は「Running Script」と表示されます。このときは再度押さず、重複実行を避けてください。

実行に成功した場合のみ、再度実行可能です。

成功!提出されたデータを日付ごとにグループ化しました。

現在の日付のシートと従業員リストを照合し、未提出リストのシートデータを作成する

もう一つコードを追加しましょう:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 従業員名簿シートと本日記入シートを比較し、未記入リストを作成する
function generateUnfilledList() {
  var listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('員工名單') // 従業員名簿シート名
  var unfilledListSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('未填寫名單') // 未記入リストシート名
  var today = new Date();
  var todayName = today.toLocaleDateString("en-US");

  var todayListSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(todayName) // 本日 MM/DD/YYYY シートを取得
  if (todayListSheet == null) {
    SpreadsheetApp.getUi().alert(todayName + ' の本日のシートが見つかりません、または「整理填寫資料」を先に実行してください');
    return;
  }

  var todayEmails = todayListSheet.getDataRange().getValues().map( x => x[1] ) // 本日シートのEmailアドレス列データリストを取得 (1 = B列)
  // インデックスは0から始まるので、1はB列
  // 出力例: Email Address,[email protected],[email protected],[email protected]...
  todayEmails.shift() // 最初のデータを削除、最初は「Email Address」という列名で意味なし
  // 出力例: [email protected],[email protected],[email protected]...

  unfilledListSheet.clear() // 未記入リストをクリアし、データ再入力準備
  unfilledListSheet.appendRow([todayName + " 未填寫名單"]) // 1行目にシートタイトルを表示

  var rows = listSheet.getDataRange().getValues(); // 従業員名簿シートを読み込み
  for(index in rows) {
    if (index == 0) { // 1行目は見出し行なので保存し、後続のデータにも見出しを付ける
      unfilledListSheet.appendRow(rows[index]);
      continue;
    }
    
    if (todayEmails.includes(rows[index][3])) { // 本日シートのEmailアドレスに該当従業員のEmailがあれば記入済みなのでスキップ (3 = D列)
      continue;
    }

    unfilledListSheet.appendRow(rows[index]); // 未記入リストシートに1行データを書き込み
  }
}

同様に保存した後、前述のコード追加方法に従い、ボタンを追加してスクリプト「generateUnfilledList」を割り当てます。

完了らテストをクリックしてください:

未記入リストが正常に作成されました!内容が表示されない場合は、以下を確認してください:

  • 社員リストが入力済み、またはテストデータを先に入力してください

  • まず「記入データの整理」作業を完了する必要があります

未記入リストのシートを読み込み、メッセージを作成して指定のSlackチャンネルに送信する

まず、Incoming WebHooks アプリを Slack チャンネルに追加します。この手段を使ってメッセージを送信します。

  1. Slack 左下の「Apps」->「Add apps」

  2. 右側の検索ボックスで「incoming」を検索してください。

  3. 「Incoming WebHooks」をクリックし、「Add」を選択してください。

未記入のメッセージを送信するチャンネルを選択してください。

最上部の「Webhook URL」をメモしてください

下にスクロールすると、メッセージ送信時に表示されるBotの名前とアイコンを設定できます。変更後は「Save Settings」を必ず押してください。

Google Sheet スクリプトに戻る

さらにコードを追加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function postSlack() {
  var ui = SpreadsheetApp.getUi();
  var result = ui.alert(
     'メッセージを送信してもよろしいですか?',
     'Slackチャンネルに未入力リマインダーを送信します',
      ui.ButtonSet.YES_NO);
  // 誤操作を防ぐため、まず確認を求める

  if (result == ui.Button.YES) {
    var unfilledListSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('未入力リスト') // 未入力リストのシート名
    var rows = unfilledListSheet.getDataRange().getValues();
    var persons = [];
    for(index in rows) {
      if (index == 0 \\|\\| index == 1) { // タイトル行とヘッダー行はスキップ
        continue;
      }
      
      var person = (rows[index][4] == "") ? (rows[index][2]) : ("<@"+rows[index][4]+">"); // マーク対象。Slack UIDがあれば優先使用、なければニックネーム表示。2 = B列 / 4 = E列
      if (person == "") { // データ異常とみなし無視
        continue;
      }
      persons.push(""+person+'\n') // 対象者を配列に追加
    }

    if (persons.length <= 0) { // マークすべき対象者がいなければ、全員入力済みのため送信キャンセル
      return;
    }

    var preText = "*[健康報告フォームのお知らせ:loudspeaker:]*\n会社は皆さんの健康を気遣っていますので、以下のメンバーは毎日健康状況の報告を忘れずにお願いします。ありがとうございます:wink:\n\n本日の未入力者リスト\n\n" // メッセージ冒頭
    var postText = "\n\n健康状況の報告は会社が皆さんの体調を把握するために必要です。毎日必ず正確にご入力ください。ありがとうございます:woman-bowing::skin-tone-2:" // メッセージ末尾
    var payload = {
      "text": preText+persons.join('')+postText,
      "attachments": [{
          "fallback": "ここにGoogleフォームのリンクを入れられます",
          "actions": [
            {
                "name": "form_link",
                "text": "健康状況報告へ移動",
                "type": "button",
                "style": "primary",
                "url": "ここにGoogleフォームのリンクを入れられます"
            }
          ],
          "footer": ":rocket:ヒント:入力欄下の「:zap:️稲妻」->「ショートカット名」をクリックすると直接入力できます。"
        }
      ]
    };
    var res = UrlFetchApp.fetch('ここにSlack Incoming AppのWebhook URLを入力してください',{
      method             : 'post',
      contentType        : 'application/json',
      payload            : JSON.stringify(payload)
    })
  }
}

同様に保存後、前述のコード追加方法に従い、もう一つボタンを追加してスクリプト「postSlack」を割り当てます。

完了したらテストをクリックしてください:

成功!!!(@U123456 が正しくタグ付けされなかったのは、IDを適当に入力したためです)

ここまでで主要な機能はすべて完成しました!

備考

公式では新しい Slack APP API の chat.postMessage を使ってメッセージを送信することを推奨しています。簡単な Incoming Webhook は将来的に廃止される予定です。ここでは手抜きで使用していませんが、次章の「社員名簿のインポート」と合わせて Slack App API を新しい方法に変更する必要があります。

従業員リストのインポート

ここでは Slack APP を作成する必要があります。

  1. https://api.slack.com/apps にアクセスしてください。

  2. 右上の「Create New App」をクリックしてください

  1. From scratch」を選択する

  1. App Name」と追加したいWorkspaceを入力してください

  1. 作成後、左側メニューから「OAuth & Permissions」設定ページを選択してください

  1. 下にスクロールして Scopes セクションへ移動します

「Add an OAuth Scope」に以下の項目を順に追加してください:

  1. 一番上に戻り、「Install to workspace」または「Reinstall to workspace」をクリックします。

Scopesが追加された場合も、ここに戻って再インストールしてください。

  1. インストール完了後、Bot User OAuth Token をコピーして取得します

  2. ウェブ版 Slack でインポートしたいメンバーリストのチャンネルを開く

ブラウザからURLを取得する:

1
https://app.slack.com/client/TXXXX/CXXXX

ここでの CXXXX はこのチャンネルのチャンネルIDです。このメッセージを控えておいてください。

10.

Google Sheet スクリプトに戻る

さらにコードを追加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function loadEmployeeList() {
  var formData = {
    'token': 'Bot User OAuth Token',
    'channel': 'Channel ID',
    'limit': 500
  };
  var options = {
    'method' : 'post',
    'payload' : formData
  };
  var response = UrlFetchApp.fetch('https://slack.com/api/conversations.members', options);
  var data = JSON.parse(response.getContentText());
  for (index in data["members"]) {
    var uid = data["members"][index];
    var formData = {
      'token': 'Bot User OAuth Token',
      'user': uid
    };
    var options = {
      'method' : 'post',
      'payload' : formData
    };
    var response = UrlFetchApp.fetch('https://slack.com/api/users.info', options);
    var user = JSON.parse(response.getContentText());

    var email = user["user"]["profile"]["email"];
    var real_name = user["user"]["profile"]["real_name_normalized"];
    var title = user["user"]["profile"]["title"];
    var row = [title, real_name, real_name, email, uid]; // カラムに従って入力

    var listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('員工名單'); // 社員リストのシート名
    listSheet.appendRow(row);
  }
}

しかし今回はボタンを追加する必要はありません。インポートは最初の一度だけで十分なので、保存後にそのまま実行すれば問題ありません。

まず「control」+「s」で保存し、上部のドロップダウンメニューから「loadEmployeeList」を選択し、「Run」をクリックすると、社員リストシートに名簿のインポートが始まります。

新しい従業員データの手動追加

今後新しい社員が入社した場合は、社員リストのシートに直接新しい行を追加し、情報を入力してください。Slack UIDはSlack上で直接確認できます:

UIDを確認したい対象をクリックし、「View full profile」をクリックしてください。

「More」をクリックして「Copy member ID」を選択すると、それが UID です。UXXXXX

完了!

以上のすべての手順が完了し、従業員の健康状態の自動追跡を開始できます。

完成ファイルは以下の Google Sheet からコピーを作成し、編集してご利用ください:

補足事項

  • Scheduled date & time でフォームメッセージを定期送信したい場合、この場合のフォームは一度しか記入できないため、ここでの使用には適していません…(少なくとも現バージョンではそうなっています)。そのため、Scheduled の記入リマインドメッセージは引き続きテキスト+Google Formリンクのみでの対応となります。

  • 現在はショートカットでフォームを開くためのハイパーリンクを使用できません。

  • Google Sheet App Script 重複実行防止:

もし実行中に誤って再度押して重複実行を防ぎたい場合は、function の最初に以下を追加してください:

1
2
3
4
5
if (PropertiesService.getScriptProperties().getProperty('FUNCTIONNAME') == 'true') {
  SpreadsheetApp.getUi().alert('ただいま処理中です...しばらくしてから再度お試しください');
  return;
}
PropertiesService.getScriptProperties().setProperty('FUNCTIONNAME', 'true');

Function 実行終了時に追加:

1
PropertiesService.getScriptProperties().setProperty('FUNCTIONNAME', 'true');

FUNCTIONNAME を対象の関数名に置き換えてください。

グローバル変数で実行を制御する。

iOS開発に関連する応用

CI/CD を連携させるために使用でき、GUI で元の見た目が悪いコマンド操作をラップできます。例えば、Slack Bitrise APP と連携し、Slack Workflow form を使ってビルドコマンドを起動する方法:

送信後、Bitrise APP があるプライベートチャンネルにコマンドが送信されます。例:

1
bitrise workflow:app_store\\|branch:develop\\|ENV[version]:4.32.0

これで Bitrise が CI/CD フローを実行できます。

関連記事

ご質問やご意見がございましたら、お問い合わせ ください。

自動化に関する最適化のご依頼も歓迎します。発注はこちら、よろしくお願いします。

Post Mediumから変換 by ZMediumToMarkdown.


🍺 Buy me a beer on PayPal

👉👉👉 Follow Me On Medium! (1,053+ Followers) 👈👈👈

本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。

Improve this page on Github.

本記事は著者により CC BY 4.0 に基づき公開されています。