皆さんこんにちは。
GMOリサーチでAPIインテグレーションの仕事をさせていただいております新卒3年目の酒井です。
私のバックグラウンドについて知りたい方はこちらからどうぞ!
GMOインターネットグループでは現在、「RPA・AI・ロボット導入」による生産性向上の結果として「給与 No.1」の実現に向けた取り組みを進めており、DX(デジタルトランスフォーメーション)化に向けて、GAS(Google Apps Script)、VBA(Visual basic for Applications) 、Python、PA(Power Automate)、PAD(Power Automate for Desktop)など業務効率化に繋がるローコード、ノーコードツールのことを総称してRPA(Robotic Process Automation)と呼んでおります。
この記事を書いている私自身、非エンジニア職でプログラミングはほとんどできませんが、これまで弊社エンジニアの方々と非エンジニアの酒井で協力して、汎用的に使えるコードづくりに挑戦してきました。
今回は弊社で実際に活用されている”RPA”の1例をご紹介させていただこうと思います。
Google Apps ScriptとSlack連携のメリット
皆さんはGoogle Sheets (Google Spreadsheet:以下スプレッドシート)で業務の案件などをリスト管理していて、ステータスを更新した瞬間に担当者に通知を送りたい、そんな風に思った瞬間はありませんでしょうか。
私のいた部署は別担当者へ業務依頼する際にスプレッドシートで「依頼リスト」を使っていたのですが、毎回、依頼のたびにメッセージを送るのが少し億劫でした。
(こちらとしても依頼内容を書く時間がかかりますし、送られた側としても毎回違うフォーマットで送られてくるので、面倒ですよね)
今回は同じ思いを持った皆様に役立つと思い、「Google Apps Script(以下GAS)」と「Slack」の連携を活用した方法をご紹介させていただきます。
なお、これからご紹介する内容については、「GASを全く使ったことがない」、「そもそもプログラミンなんて一切わからない」という方でも使えるよう、わかりやすく解説していきますので、どうぞよろしくお願いします。
業務自動化に向けたアプリ、スクリプト紹介
まず、具体的にどういった内容を自動化できるのか、について解説させていただきます。
例えば、下記のようにチーム間で作業依頼をしていたリストがあるとします。
まずは、依頼するところから着目していきます。
1行目のD列の「プロジェクト名」というところに「Slack通知GAS作成」と記載したので、これを私、「酒井」から「木村」さん宛てにF列の「ステータス」を「1.未確認」から「2.依頼」に変更して、正式に依頼したいと思います。
本来であれば、このリストを更新しただけでは、依頼された側の木村さんは気づきません。
なので、他のツール等でお願いの連絡をする必要があります。
これが1日1件くらいであれば、大した労力もかかりませんが、仮にもし100件色んな人からメッセージが来る、といった場合は誰から来たかをチェックするだけで一苦労ですよね…。
かといって、依頼される側がリストをずっと見ている、というのも非効率的です。
タスクを依頼した後、すぐに依頼された側は作業に取り掛かれる環境がある、というのが理想的です。
そこで今回のプログラム(GAS)を導入すると、F列を「2.依頼」に変更するだけで↓下のように作業者に通知を送ることができます。
今回の機能を使う際に最低限必要なアプリについては以下となります。
・Slack(アプリ版でもブラウザ版でどちらでもOK)
・Webhook(Slackのアプリ)
(上記リンクが開けない場合はSlack app directory で incoming webhookを検索してください)
スクリプトの全容は下記となります。
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 55 56 |
function notifyToSlack() { // 変更されたセルの特定 Identification of modified cells const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシート const sheet = spreadsheet.getActiveSheet(); // シート const activeCell = sheet.getActiveCell(); // セル const rows = activeCell.getRow(); // 行 const columns = activeCell.getColumn(); // 列 const activeValue = activeCell.getValue(); // セルの値 const sheetName = sheet.getSheetName(); if (sheet.getSheetName() == "依頼表"){ if ( columns == 6 ){ // ex.変更されたのが6列目であれば、以下の処理に入る if ( activeValue == "2.依頼" ){ // ex.ステータスが「2.依頼」の場合、以下の処理に入る let ProjectNo = sheet.getRange(rows,1).getValue(); // 1列目の値 let ProjectFrom = sheet.getRange(rows,2).getValue(); // 2列目の値 let ProjectTo = sheet.getRange(rows,3).getValue(); // 3列目の値 let ProjectName = sheet.getRange(rows,4).getValue(); // 4列目の値 let ProjectLink = sheet.getRange(rows,5).getValue(); // 5列目の値 let ProjectStatus = sheet.getRange(rows,6).getValue(); // 6列目の値 // 投稿内容 自由記述 var message = "---------------------------------------------------------------------------------------------------------------------------------\n新しい依頼が追加されました。\n" + "No:" + ProjectNo + "\n" + "依頼者:" + ProjectFrom + "\n" + "作業者:" + ProjectTo + "\n" + "プロジェクト名:" + ProjectName + "\n" + "リンク:" + ProjectLink + "\n" + "ステータス:" + ProjectStatus + "\n" + "---------------------------------------------------------------------------------------------------------------------------------\n"; // 以下、おまじない Below is a spell var jsonData = { "text" : message }; var payload = JSON.stringify(jsonData); var options = { "method" : "post", "contentType" : "application/json", "payload" : payload }; // WebhookURLを書き換える Rewrite WebhookUL UrlFetchApp.fetch("https://hooks.slack.com/services/xxxxxxxxxxxxxx/xxxxx/xxxxxxxxxxx", options); } } } } |
先に上記のスクリプトをGAS上にご記載いただくと、後述の内容を見ながらスムーズに進められます。
具体的な動作内容-Google Apps Script側
Google Apps Scriptのはじめかた
まず、ステータスを変更した際に追加したいスプレッドシートを開いてください。
その後、Apps Scriptに行き、下記の内容を変更します。
(拡張機能にApps Scriptがあります。)
1 2 3 |
function myFunction() { } |
Apps Scriptを開くと↑上記のように書いてあるので、ここに上書きしてください。
Google Apps Script列の読み方
GASではA列=1、B列=2、C列=3のように数値で認識させます。
下記のサンプルスクリプトの場合は参照したい「Status」がF列に存在するので数値が6「if ( columns == 6 )」となっています。
1 |
if ( columns == 6 ){ // ex.変更されたのが6列目であれば、以下の処理に入る |
どこをトリガーにするのか
次に下記の”2.依頼”の記述を変更します。
今回は先ほどセットしたステータスの部分は「2.依頼」になったら通知するという次第です。
こちらを任意のものに書き換えてください。
1 |
if ( activeValue == "2.依頼" ){ // ex.ステータスが「2.依頼」の場合、以下の処理に入る |
スプレッドシートからSlackに転記したい列の指定
下記の6つについては、実際にSlackに通知された際に転記したい列の位置を設定します。
3-2の作業と同様にA列=1で列のアルファベット部分を数値に変換して、ご記載ください。
ProjectNo等の名称は好きなものを設定しています。わかりやすいものを設定推奨です。
例では6つしかありませんが、他にも読み取りたい項目がある場合はいくらでも追加可能です。
1 2 3 4 5 6 |
let ProjectNo = sheet.getRange(rows,1).getValue(); // 1列目の値 let ProjectFrom = sheet.getRange(rows,2).getValue(); // 2列目の値 let ProjectTo = sheet.getRange(rows,3).getValue(); // 3列目の値 let ProjectName = sheet.getRange(rows,4).getValue(); // 4列目の値 let ProjectLink = sheet.getRange(rows,5).getValue(); // 5列目の値 let ProjectStatus = sheet.getRange(rows,6).getValue(); // 6列目の値 |
スプレッドシートからSlackに表示したい内容の設定
次に3-4で設定した内容(let ProjectNo等)について表示したいものを以下に記載します。
こちらも3-4と同様に追加したいものがあれば適宜追加してください。
追加する場合は必ず、最後の行に「; 」をお忘れなきようお願いします。
ただし、Slackの文字数は一度の投稿につき、4000文字までとなっており、それ以上の文字数になるとエラーとなってしまいます。何事も使いすぎは禁物です。
(一列だと見づらいので「+ “\n”」は改行するために使っています。)
1 2 3 4 5 6 |
+ "No:" + ProjectNo + "\n" + "依頼者:" + ProjectFrom + "\n" + "作業者:" + ProjectTo + "\n" + "プロジェクト名:" + ProjectName + "\n" + "リンク:" + ProjectLink + "\n" + "ステータス:" + ProjectStatus + "\n" |
※「”\n” 」は改行タグです。これを入れることで実際に表示される文言に改行が入ります。
具体的な設定内容-Slack側
Webhookのインストールについて
次にWebhookをインストールします。
リクエストを送信
Incoming Webhookを見つけたら、次に「設定をリクエストする」を押してください。
※Webhookの導入可否に関しては各社のシステム担当者にご確認ください。また、各社によってリクエストのフローは異なる場合がございます。
WebhookをSlackに追加
リクエストが許可されたら、下の「Slackに追加」を押してください。
投稿したいSlackチャンネルを選択
次にどのチャンネルに対して投稿するかを設定します。
プルダウン(ドロップダウン)から選べるので、選びたいSlackチャンネルを選択してください。
※個別にDMで送ることも可能ですが、極力パブリックチャンネル推奨です。
WebhookURLをコピー
Slackチャンネルを選択後、WebhookURLをコピーしてください。下記の緑字の部分に発行したWebhookURLを挿入してください。
1 2 |
// WebhookURLを書き換える Rewrite WebhookUL UrlFetchApp.fetch("https://hooks.slack.com/services/xxxxxxxxxxxxxx/xxxxx/xxxxxxxxxxx", options); |
Google Apps ScriptとSlackの最終連携(トリガーについて)
最後にまたApps Scriptに戻ります。
「エディタ」項目の「トリガー」をクリックしてください。
次に右下のトリガーを追加を押してください。
トリガーを下の画像のように設定すれば準備完了です。
これによりSlackに通知が来るようになります。
まとめ
こちらの記事はいかがでしたでしょうか?
弊社では現在、こちらのシステムを2つの部署で使用しております。
自動的に通知できるおかげで、リストを都度確認する必要がなく、作業者は依頼をSlack上で待つのみとなりました。
今後もGMOリサーチテックブログでは業務効率化に関するRPA利用の記事をあげていきます。
(RPAおすすめ本もこちらで紹介しています)
この記事が皆さんの業務効率化につながれば幸いです。
Robot for eveyone!!