Slack|全自動WFH健康狀況回報システムで業務効率化|Google Sheet×App Script連携
リモートワーク中の健康管理に悩む企業向けに、SlackとGoogle Sheet、App Scriptを活用した自動化システムを構築。手動入力の手間削減と正確な健康データ収集を実現し、業務効率を大幅に向上させます。
本記事は AI による翻訳をもとに作成されています。表現が不自然な箇所がありましたら、ぜひコメントでお知らせください。
記事一覧
Slackで完全自動の在宅勤務社員健康状況報告システムを構築する
Slack Workflow と Google Sheet と App Script を組み合わせて効率アップ
Photo by Stephen Phillips — Hostreviews.co.uk
前書き
全面的なリモートワークに対応し、会社は全メンバーの健康状態を重視しています。毎日、体調の有無を報告し、People Operationsが一括で記録・管理します。
私たちの最適化前のフロー
[自動化] Slack チャンネルで毎朝10時に健康フォームのリマインドメッセージを定時送信(最適化前の唯一の自動化部分)
従業員がリンクをクリックして Google フォームで健康状態を入力する
データを Google Sheet に保存して回答を記録する
[手動] People Operations は毎日退勤時間近くにリストを照合し、記入忘れの社員を抽出する
[手動] Slack チャンネルで入力リマインダーを送信し、忘れた人を一人ずつタグ付けする
以上は弊社の健康報告追跡プロセスです。会社ごとに規模や運用方法が異なるため、本記事はあくまで最適化の例として、Slack Workflowの使用方法や基本的なApp Scriptの記述を学ぶためのものです。実際の運用はケースバイケースで対応してください。
問題点
Slackのコンテキストを離れてブラウザでGoogleフォームのページを開いて入力する必要があり、特にスマートフォンではさらに不便です。
Google Formはメールアドレスのみ自動入力でき、記入者の名前や部署情報は自動で追加できません。
毎日の手動照合や手動タグ付けは非常に人手と時間がかかります。
解決策
これまでにいくつかの自動化を試してきましたが、このプロセスはデータソースが固定(社員リスト)、条件が単純、動作が定型的で、自動化に非常に適しています。最初に着手しなかったのは、良い入力方法が見つからなかったからです(実際には面白くて研究したいポイントがなかったため)。そのため放置していましたが、海総理のこの投稿を見て、Slack Workflowは定期メッセージ送信だけでなく、フォーム機能もあることに気づきました:
画像出典: 海総理
これで手がうずいてきた!
もし Slack Workflow Form とメッセージ送信の自動化を組み合わせれば、上記で述べたすべての課題を解決できるのではないかと考え、実装を始めました。
最適化後のフロー
まずは、最適化後のプロセスと結果を紹介します。
[自動化] Slack チャンネルで毎朝10時に健康フォームのリマインドメッセージを定時送信する
Google Form または Slack Workflow Form から健康に関する質問に回答する
データはすべて Google Sheet に保存されます 回答記録
People Operations は毎日退勤間近に「未記入リストを生成」ボタンをクリックします
[自動化] App Scriptを使って従業員リストと記入リストを照合し、未記入リストを抽出する
[自動化] 「生成&送信メッセージ」をクリックして未記入者へのリマインダーを自動送信&対象者を自動タグ付け
お疲れ様でした!
効果
(個人予測)
記入時間は従業員一人あたり毎日約30秒短縮できます。
People Operations はこの作業を毎日約20〜30分短縮できます。
動作の仕組み
App Script を使って Sheet を管理する。
外部から入力されたデータはすべて Responses シートに保存する
App Script 関数を作成し、Responses のデータを記入日付ごとに各日のシートに振り分けます。該当の日付のシートがなければ新規作成します。シート名は日付を直接使用し、識別と利用を容易にします。
現在の日付のシートと従業員リストを照合し、未提出リストのシートデータを作成する
未記入リストのシートを読み込み、メッセージを作成して指定の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、またはチャンネルを選択してください
「リストから選択」 の例:
リスト項目を追加:新しいオプションを追加できます
Default selection:デフォルト選択
Make this required:この質問を必須にする
Add Question:さらに質問を追加可能
右側の「↓」「⬆」で順序を調整、「✎」で展開して編集可能
フォームの入力内容をチャンネルまたは特定のユーザーに送信するかどうかを選択できます
返信を送信する先として…を選択することもできます:
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」ステップを選択します。
まずは Google アカウントの認証を完了するために、「Connect account」をクリックします。
Select a spreadsheet:対象の回答用 Google Sheet を選択してください。最初に作成した Google Form の Google Sheet を選んでください。
Sheet:同上
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 にトリガーボタンを追加します(ボタンは手動で押す必要があり、データが書き込まれた際に自動で分割されることはできません)。
まず新しいシートを作成し、「未記入リスト」と名前を付けます。
上部ツールバーで「挿入」->「図形描画」を選択してください。
このインターフェースを使って、ボタンを作成します。
「保存して閉じる」後にボタンの調整や移動が可能;右上の「…」をクリックして「スクリプトを割り当て」を選択してください
「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 チャンネルに追加します。この手段を使ってメッセージを送信します。
Slack 左下の「Apps」->「Add apps」
右側の検索ボックスで「incoming」を検索してください。
「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 を作成する必要があります。
https://api.slack.com/apps にアクセスしてください。
右上の「Create New App」をクリックしてください
- 「From scratch」を選択する
- 「App Name」と追加したいWorkspaceを入力してください
- 作成後、左側メニューから「OAuth & Permissions」設定ページを選択してください
- 下にスクロールして Scopes セクションへ移動します
「Add an OAuth Scope」に以下の項目を順に追加してください:
アプリでメッセージを送信したい場合は、ここに chat.postMessage を追加できます。
- 一番上に戻り、「Install to workspace」または「Reinstall to workspace」をクリックします。
Scopesが追加された場合も、ここに戻って再インストールしてください。
インストール完了後、
Bot User OAuth Tokenをコピーして取得しますウェブ版 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.
本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。


{:target="_blank"}](/assets/d61062833c1a/1*yKBpGlHEVMj4QbjGuB7aHQ.webp)














































































