見出し画像

【GAS】Google Apps Script 活用事例 SlackのCustom Slash Commandで名前の似たスタッフを検索して、Slackに返してくれるスクリプト

せっかく作ってもお前ら使わないじゃん?

大作は次第に忘れられ、使われなくなる。シートにいちいちアクセスするのが面倒......。あの苦労は一体......貴様、俺の努力を一体何だと思っているんだって、言いたい所ですが、作った張本人の俺も全く使っていない。「あー.....そんなの昔作ったな」程度。

しかし、アイデア自体は秀逸だったので、それをSlackのSlash Commandで再現することにしました。

VLOOKUP関数の曖昧検索をGASでやってのける

この記事を書いていた頃と比べると、GASで出来る事が圧倒的に広がりました。上記の記事で実現した事は、外国人スタッフには、「メリーアン、マリーローズ、ジャッキー、ジェシー、ジェーン」など似た名前がたくさんいます。日本人に鈴木とか高橋とか佐藤が多いのと一緒です。例えば、メリーと検索すると、名前にメリーが付く人を全員Slackに投稿してくれる、そんな仕組みを作りました。

部分一致しさえすれば、スタッフIDをSlackから離れず把握することが出来ます!!

=IFERROR(VLOOKUP("*"&$B$2&"*",'シート名'!$C$2:$O,1,0),"")

関数でも作れなくは無いんです......でも使ってくれず......。

HTMLやCSSを書く必要がないので、Slash Commandを作る方がよっぽど簡単だった。

工数的には、Slash Commandは短時間で出来ましたが、今回も、作り上げるまでに少し躓いた部分がありました。そこも併せてご紹介したいと思います。最近、Google Apps ScriptはV8に対応しました。ただし、ログの出力などが新構文で書くと、ちょっと遅いためイライラします。

V8へのアップデートの過渡期なので仕方無いんですかね......そんな事情もあって、V8の有効化、無効化のオンオフを繰り返していたら、ウェブアプリケーションとして導入のボタンを押しても、風車が周り続けて、先に進めなくなってしまいました。

最終手段、appscript.jsonを弄って、プロジェクトを強制的に修正する。

{
 "timeZone": "Asia/Tokyo",
 "dependencies": {
   "libraries": [{
     "userSymbol": "Underscore",
     "libraryId": "1PcEHcGVC1njZd8SfXtmgQk19djwVd2GrrW1gd7U5hNk033tzi6IUvIAV",
     "version": "2"
   }]
 },
 "webapp": {
   "access": "ANYONE_ANONYMOUS",
   "executeAs": "USER_DEPLOYING"
 },
 "exceptionLogging": "STACKDRIVER",
 "runtimeVersion": "V8",
 "sheets": {
   "macros": [{
     "menuName": "垂直方向",
     "functionName": "myFunction"
   }]
 }
}

appscript.jsonは、弄らないのが基本.....。あくまで最終手段です。

"webapp": {
   "access": "ANYONE_ANONYMOUS",
   "executeAs": "USER_DEPLOYING"
 },

スクリーンショット 2020-02-15 17.40.31

UI操作で変更出来る項目が表示されない場合、このappscript.jsonを上記のように変更すると直ります。(直りました。)

他にも出た、エラー

/****** はエラー「http_client_error」により失敗しました

というエラーが出て、少しハマりました。これは、GASと接続できません的なメッセージかなと思っています。(厳密には知らない)なので、ウェブアプリケーションから導入の際に表示されるURLをSlack API側にコピーし直したところ、いつの間にかエラーが出なくなり、直っていました。

参考になったブログページ

実際のソースコード 20行くらい

/*Slackから情報を取得

Verification Token
*************

*/
function doPost(e) {
 var verificationToken = e.parameter.token;
 if (verificationToken !== '******************') { // AppのVerification Tokenを入れる
   throw new Error('Invalid token');
 }

 var keyWords    = e.parameter.text;
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 var sheet       = spreadsheet.getSheetByName('DB');
 var values      = sheet.getDataRange().getValues();
 var results     = '';

 /*見出しを省くため、2行目からスタート*/
 for(var i = 1; i < values.length; i++ ){
   
   /*C列の名前から、部分一致でフルネームを出力する*/
   if(values[i][2].indexOf(keyWords) !== -1){
     results += values[i][0] + ':' + values[i][2] + '\n';
   }//if
 }//for
  
 var response = { text: results }                                                                                                   
 
 return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}

作る手順(何個か作ってみて効率良いと思われる手順)

1. まずは、doPost(e)を使わずに、GASの実際の処理部分のみ書く
2. 汎用的に使い回せる部分と統合、ウェブアプリケーションとして導入
3. Slack APIの設定をする
4. テスト投稿する

Verification Tokenって何ぞ?

Slack APIにアクセスしましょう。話は、まずそこから

スクリーンショット 2020-02-15 19.38.18

左のサイドバーのsettingsのBasic Informationをクリック
スクロールしていくと、App Credentialsという項目の中にVerification Tokenがあります。

スクリーンショット 2020-02-15 19.41.41

ここにVerification Tokenが記載されています。この部分をコピーして、先ほどのソースコードの**********って部分に貼り付けます。

if (verificationToken !== '******************') { // AppのVerification Tokenを入れる
   throw new Error('Invalid token');
 }

GAS側の設定で、Who has access to the app?の項目で、anyone, even anonymous. 誰でもアクセス可能。匿名可にしたと思うのですが、実際には、この項目でSlackからのアクセスかどうかを判断し、それ以外からのアクセスを防いでいるのだと思います。(思うってだけで厳密に分かりません。)

GASの処理は、シンプル

for(var i = 1; i < values.length; i++ ){
   
   /*C列の名前から、部分一致でフルネームを出力する*/
   if(values[i][2].indexOf(keyWords) !== -1){
     results += values[i][0] + ':' + values[i][2] + '\n';
   }//if
 }//for

indexOfで、フルネームの一次元配列の中に、ユーザーが検索した単語や文章が含まれているのかを探しているだけです。ただ、それだけ。ついでに、IDを返してあげると、業務がスムーズになるので付け足ししています。indexOfは使いこなせると、マジでヤバいくらい即戦力になるので、頑張りましょう!!

使い方やエラーでハマった時の備忘録を、このブログでも書いているので、ぜひ覗いてみてください。

Incoming WebhookやUrlFetchAppを使わない。

return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);

使うのはこれだけ。シンプル!!これはマジで便利で、スプレッドシート開いて、スクリプトを実行してみたいな手順がほぼゼロになりました。社内のコミュニケーションツールという事もあり、全員開いているので、そのツールから離れずに実行出来るというのは、良いですね!!

この凄まじい便利さは、チームに感謝される

「えっ!?どうなっ・・・すっ・・・すごい!!」って反応でした。ただ今の会社だと人事評価で、こういった効率化は評価されない。上司が、まずプログラミングを知らない。転職しよっかな。

LINE messaging API で、似たような事やってみました!!


この記事が気に入ったらサポートをしてみませんか?