ZhgChg.Li

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

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フォームはメールアドレスのみ自動入力可能で、記入者の名前や部署情報は自動で追加できません。

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

解決策

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

画像出典: 海総理

画像出典: 海総理

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

Slack Workflow From とメッセージ送信の自動化を組み合わせれば、前述の すべての課題 を解決できるはずであり、原理的にも可能です!そこで実装に取り掛かりました。

最適化後のフロー

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

  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」を選択します。

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

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

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

現在、Slack ワークフローのトリガー時間点は全部で5種類あります:

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

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

  • Emojiリアクション:誰かがTarget Channelのメッセージに指定した絵文字を押したとき…(重要なメッセージの既読確認としてXXXの絵文字を押してもらい、誰が読んだかを把握するのに使えるかもしれません)

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

  • Webhook:外部のWebhookトリガーで、応用機能として第三者や自分で構築したAPIと連携して内部ワークフローをつなげることができます。

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

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

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

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

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

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

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

質問の種類を選択してください

  • Short answer:単一行入力欄

  • Long answer:複数行入力欄

  • Select from a list:リストから選択(単一選択)

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

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

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

  1. Add list item:新しい選択肢を追加できます

  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 に追加していない場合は、先にこちらから APP をインストールしてください。

前のステップの後、「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 (デフォルト):該当ユーザーにタグを付けます。生データは <@User ID> です。

  • Name:ユーザー名

  • Email:ユーザーのメールアドレス

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

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

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

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

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

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

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

Slack workflow から入力時間を取得

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

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

同じく reddit のあの記事 の達人ユーザーが提供したトリッキーな方法で、クリーンな Timestamp シートを作成し、1 行のデータと列に =NOW() を入れて、Update でセルを最新に更新し、Select で現在のタイムスタンプを取得できます。

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

  • Row:IDのような役割で、最初は「1」を設定します。後でSelect & Updateの操作で使用し、データ行を指定します。

  • Timestamp:設定値 =NOW() にして、常に現在の時間を表示させる

  • Value:Timestamp 欄の更新時間をトリガーするための値で、内容は自由です。ここでは入力者のメールアドレスを入れていますが、更新をトリガーできれば何でも構いません。

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

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」を押します。

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」は「フォームを送信した人」を選択してください。

メッセージ内容に順番に質問のタイトルを入力し、「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 のデータを記入日ごとに各日のシートに振り分ける

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」と表示されます。この間は再度押さないでください。重複実行を避けるためです。

実行成功が表示されるまで、再度実行できません。

成功!記録を日付ごとにグループ化しました。

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

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

// 従業員リストシートと本日記入シートを比較し、未記入リストを作成する
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] ) // 本日シートのメールアドレス欄データリストを取得 (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])) { // 本日シートのメールアドレスに該当従業員のメールがあれば記入済みなのでスキップ (3 = D列)
      continue;
    }

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

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

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

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

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

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

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

まず、Incoming WebHooks App を Slack チャンネルに追加します。これを通じてメッセージを送信します。

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

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

  3. 「Incoming WebHooks」->「Add」をクリックしてください

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

最上部の「Webhook URL」を控えてください

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

Google Sheet スクリプトに戻りましょう

再度コードを追加します:

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) { // タイトルとカラムタイトルの2行はスキップ
        continue;
      }
      
      var person = (rows[index][4] == "") ? (rows[index][2]) : ("<@"+rows[index][4]+">"); // 対象者をメンション。Slack UIDがあれば優先、なければニックネーム表示。2 = Column B / 4 = Column 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 Formのリンクを入れられます",
          "actions": [
            {
                "name": "form_link",
                "text": "健康報告フォームへ",
                "type": "button",
                "style": "primary",
                "url": "ここにGoogle Formのリンクを入れられます"
            }
          ],
          "footer": ":rocket:ヒント:入力欄下の「:zap:️稲妻」->「Shortcut Name」をクリックすると直接入力できます。"
        }
      ]
    };
    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」と追加したいワークスペースを入力してください

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

  1. 下にスクロールしてScopesセクションへ移動してください

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

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

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

  1. インストール完了後、Bot User OAuth Token を取得してコピーしてください

  2. Web版のSlackで名簿をインポートしたいチャンネルを開く

ブラウザからURLを取得:

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

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

10.

Google Sheet スクリプトに戻りましょう

再度コードを追加します:

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 の最初に以下を追加してください:

if (PropertiesService.getScriptProperties().getProperty('FUNCTIONNAME') == 'true') {
  SpreadsheetApp.getUi().alert('忙しいです…しばらくしてから再試行してください');
  return;
}
PropertiesService.getScriptProperties().setProperty('FUNCTIONNAME', 'true');

Function 実行終了時に次を追加:

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

(コード内のコメントはありませんので、翻訳は不要です)

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

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

iOS開発に関連する応用

CI/CD と連携可能で、GUI を使って元の見た目が悪いコマンド操作をラップできます。例えば、Slack Bitrise APP と組み合わせて、Slack Workflow form からビルドコマンドを起動することができます:

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

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

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

関連記事

自動化に関するご相談も歓迎です。こちらからご連絡ください。よろしくお願いします。

Post Mediumから変換されたもの by ZMediumToMarkdown.

GitHub で編集
この記事を改善
本記事は Medium で初公開
オリジナルを読む
この記事をシェア
リンクをコピー · SNS でシェア
ZhgChgLi
著者

ZhgChgLi

An iOS, web, and automation developer from Taiwan 🇹🇼 who also loves sharing, traveling, and writing.

コメント