はじめに
こんにちは。家にいる時間が長くなってからジャンキーなベジタリアン料理が趣味になっている大浦です。(おからこんにゃくのカルビ丼おいしいですよ!) ここ最近 Slack のワークフローのステップにアプリが追加されたことにより非常に便利になったので、そのひとつの例を書いていきたいと思います。ワークフローについては去年末に「Slack ワークフローをさわってみた」という記事を投稿してますので参考にしてみてください。
本記事で扱うアプリのステップ
Google Sheets for Workflow Builder https://slack.com/app-pages/google-sheets
Google スプレッドシートの行の追加に Slack が使えるようになって業務効率化が捗ります。🎉
https://slack.com/apps/A01AWGA48G6-google-sheets-for-workflow-builder
何に使える?
下記のような 頻度は低いがそれでも一定発生する業務
に向いているでしょう。
- 相談窓口
- 稼働報告/管理
- 従業員の体調報告/管理
- 定期的なミーティングやイベントのフィードバックの収集
逆に、頻度が極端に低くかったり高かったりする業務だと、Slacck ワークフローは使わず、直接スプレッドシートに書き込んだり、専用のUIを設けたりしたほうがよいと考えます。当人のコンテキストスイッチの負荷が目安というところで、なかなか塩梅が難しいところですね。
具体的な例
実現したいこと
フリーランスで勤怠のシステムを導入していないが、以下を記録したい。
- 業務開始と終了の時間
- 作業予定
- 作業実績
必要なもの
- Slack のアカウント
- Google のアカウント
- Google Sheets for Workflow Builder (導入にはSlackの管理者権限が必要)
手順
シートの作成
Google スプレットシート上のシートは 2つ用意します。
「raw」シート: Slack からのデータの受け皿
重要: ヘッダー行を追加しましょう。Google Sheets for Workflow Builder
で紐付けのキーとなります。
「view」シート: rawシートで収集したデータの整形後の参照用
ワークフローの作成
2パターンのワークフロー(稼働開始ワークフローと稼働終了ワークフロー)を作成し、Google Sheets for Workflow Builder
を利用してシート raw
にデータを流し込みます。
稼働開始のワークフロー
ワークフロービルダーを立ち上げましょう。
最初にワークフローの名前をつけます。
今回はショートカットをトリガーとしたいので ショートカット
を選択します。
稼働開始のショートカットが表示されるチャンネルと表示される名称を設定します。
ステップを追加
していきましょう。
稼働報告のためのフォームを追加します。
フォームに表示されるタイトルや項目の設定をします。
更にフォーム入力後の ステップを追加
します。
ここでいよいよ Add a spreadsheet row
の追加です。
ログイン中の Google アカウントに紐付いたスプレッドシートが Add
先として選択できるので、指定します。
スプレッドシートのカラムとフォームに入力した内容の紐付け等を行います。
これで 公開する
を実行すると有効化されます。
Slack のこういう演出良いですよね。
稼働終了のワークフロー
基本的な手順は稼働開始のワークフローと変わらないですが、フォームの作成画面と Add a spreadsheet row
のスクリーンショットだけ参考までに載せておきます。
実行してみる
一度動作確認をします。 指定したチャンネルのショートカットに現れました。
選択すると作成したフォームが現れます。
登録するとスプレッドシートに反映されます。
が、ご覧の通り TimeStamp
と Date
が空です。
タイムスタンプと日付が自動で登録されるようにする
ここは Google App Script を使います。
スクリプト エディタの画面を開きます。
コード.gs
を以下の内容で上書きします。
function addTimeStampAndDate() { const rawSheet = 'raw'; const headerRow = 1; const timeStampColumn = 1; const dateColumn = 2; const typeColumn = 3; const sheet = SpreadsheetApp.getActiveSheet(); const sheetName = sheet.getName(); if (sheetName !== rawSheet) return; const range = sheet.getActiveRange(); const col = range.getColumn(); const row = range.getRow(); if (row === headerRow) return; const currentDate = new Date(); const timeStamp = Utilities.formatDate(currentDate, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss'); const date = Utilities.formatDate(currentDate, 'Asia/Tokyo', 'yyyy/MM/dd'); const timeStampCell = sheet.getRange(row, timeStampColumn); const dateCell = sheet.getRange(row, dateColumn); const typeCell = sheet.getRange(row, typeColumn); if (typeCell.isBlank()) return; if(timeStampCell.isBlank()) timeStampCell.setValue(timeStamp); if(dateCell.isBlank()) dateCell.setValue(date); }
上書きしたら保存します。
次に、作成したスクリプトが、稼働開始の行が追加されたタイミングで発火するようにトリガーを作成します。
トリガーを追加
しましょう。
以下のような設定にします。
再び実行してみる
ワークフローを実行すると、以下のようにタイムスタンプと日付が埋まっていることが確認できます。
view をつくる
本記事はワークフローの紹介をメインとしたいためこちらの詳細は省かせていただきますが、方法としては Spreadsheet の関数を駆使する方法と、GASを使ってセルを埋めていく方法、またそれの組み合わせが考えられます。
最後に
今回は取り上げていませんが、Google sheets のステップには行の追加の他にも行の選択や更新、削除もありますので必要に応じて導入するのも良さそうです。また、公式のアプリのステップ一覧のページ「Turn routine tasks into automated workflows」をのぞいてみると Datadog や Zapier など、有名どころもあります。さらには独自の Slack アプリを作成してワークフローのステップとしての機能をもたすこともできる1 ので内製の業務システムの一部として活用することもできそうですね。 この非常に強力なワークフローのアプリのステップの機能、みなさんも周りの業務でどういう活用ができそうか是非検討してみてください。
We Are Hiring!
クラウドワークスでは働き方の変革に挑戦するエンジニアを募集しています!
Python エンジニア枠もありますのでご興味ある方はお気軽にお声がけください!