見出し画像

GAS×slack 名言Bot 完走・追憶編

これまでのあらすじ

こちらの連載記事を参考に、slackへの名言Bot投稿を進めてきた。

残り3つ、行ってみよう。

画像1

2次元配列

Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)

↓これを

 const body = sheet.getRange(index,1).getValue();

↓こうした。getRange(index,1,1,3)で、index行目の1列を基点に、1行分、3列分の範囲を取ってくる。

 const body = sheet.getRange(index,1,1,3).getValues();

getRangeの書き方は、htmlやCSSでのmarginやpaddingのポジション指定(?)に似ているかもしれない。margin/paddingのポジション指定は上下左右だが、配列は、グループ、並び方が変わるっていうか、うーん。

[[名言, 人物, 情報]] という状態で取り出せたので、整えていく。二次元配列から要素を取り出す、ということになるらしい。

こんな感じにしてみる。

  const values = sheet.getRange(index,1,1,3).getValues();
 let body = '';
       body += '\n meigen: '+ values[0][0] ; //meigen
       body += '\n person: '+ values[0][1] ; //person
       body += '\n info: '+ values[0][2] ; //info

画像2

数え方、取り出し方がキモなのかなー。今後、また理解を深める必要がありそう。

メッセージの装飾

この辺はチャットワークの装飾の説明なので、slackでどうするか、という面で考えてみる。似たような感じで、ボールドとかありそうなんだけどな。

Slack APIドキュメント的なものを見ればいいんだろうか。

おあ~どこ見ればいいんだ~~~~。

適当にタグで囲えばいいのか? 

body += '<b>meigen: '+ values[0][0]+ '</b>' ; //meigen
       body += '\n person: '+ values[0][1] ; //person
       body += '\n info: '+ values[0][2] ; //info

だめでした。

画像3

「GAS slack 装飾」ググってみた。Markdown記法っぽい。

これならどうじゃ。

       body += '_meigen: '+ values[0][0]+ '_' ; //meigen
       body += '\n person: '+ values[0][1] ; //person
       body += '\n info: '+ values[0][2] ; //info

画像4

できたあああ~~~~!よし、ひとまず、これでよし。

ドキュメンテーションコメント

今後のために、説明入れておこう、って感じかな~。書いた人がいなくても読み継がれ利用できるよう、死んでないけど遺言的な...。

現時点のコードはこうなった。自分のメモが多い。リーダブルコード読んで、そのへんの心得を学ばないとかなあ。console.logは消してもいいかもしんないけど、まだ見返したりしたときに手掛かりが欲しい。

/**
* スプレッドシートの名言を一つslackに送信するBot
* トリガー設定
*/

function meigen04() {
 const sheet = SpreadsheetApp.getActiveSheet(); //sheetの定義 SpreadsheetAppでコンテナバインドでアクティブなシート
 const lastRow = sheet.getLastRow(); //最終行の定義 先に定義したsheetの最終行
 const token = PropertiesService.getScriptProperties().getProperty('slack_TOKEN');
 
 const rng=sheet.getRange("D:D")//rng範囲の定義、指定。ここではD列に今後追加していくことも想定してD:Dとした。

 const vals = rng.getValues()//const rng で指定した範囲の値。
 console.log(vals)//const rng で指定した範囲の値をconsole.logで確認。

 const valsf = vals.flat() //★二次元配列→一次元配列
 console.log(valsf)//

 var index=valsf.indexOf('')//indexOf('') で上からみていって空白の値の行数を返す。
 console.log(index)//var index の値をconsole.logで確認。上から0,1,...と数えることに注意。
 
 /**
* slackにメッセージを送信する
*
* @param {string} token - slack APIトークン
* @param {string} body - slackに送信するメッセージ本文
 */

 //★以下、流用
 //投稿したい内容をスプシから取得


 const values = sheet.getRange(index,1,1,3).getValues();
 let body = '';
   body += '_meigen: '+ values[0][0]+ '_' ; //meigen
   body += '\n person: '+ values[0][1] ; //person
   body += '\n info: '+ values[0][2] ; //info

   console.log(body); 

 const options =
     {
       "method" : "post",
       "contentType" : "application/json",
       "payload" : JSON.stringify(

         {
           "icon_emoji" : ":robot_face:",   //botアイコンの設定
           "text" : " \n 今日の名言です。~index+二次元配列 version~\n \n "+body,//body をここにもってきた。
           link_names: 1
         }
       )      
     };
       
 UrlFetchApp.fetch(token, options);//投稿先

 sheet.getRange(index+1, 4).setValue(true); //trueをシートにsetする
 if(index >= lastRow) {
   sheet.getRange(2, 4, lastRow).clearContent();
 }
}


名言Botを完走したぜイエーイ

寄り道したり、細かいところつっかえたりしつつ、1日30分~2時間程度で1~2週間で完走といったところか。
記事で細かく、初心者に寄り添って書いてあるので、基本的にそれをガイドに走っていけた。感謝。slackに応用できてよかった。

細かいことを言うと、上記のコードだと、スプシの1行目、データタイトルも取ってきてしまうので、それをどうにかしないとあかん。簡単なのはタイトル行を消してしまうことだが、タイトルを生かしたまま、1行目は飛ばすみたいなことを書かないといけないかもしれない。そこまで今頭まわんないな~~。

画像5

振り返って、特にポイント、思い出
・変数、定数は実地で使ってみて理解が深まってきた気がする。
・データ型はまだハラオチしてない。
・console.logにはお世話になっております。
・GAS,これはオブジェクト指向ってやつなのか??
・for,if,while,break これはこの後使うときにまたつっかえそうな雰囲気がバリバリ出ている。
・APIまだよくわからん。IFTTTとかなんか連携して便利なやつ、という認識。
・ライブラリまだよくわからん。
・2次元配列 枠、箱が違うっていう感じ。
・Slack APIドキュメントの見方がよくわからん。

今後・宿題

・第1回講義 予習
・名言bot 1行目問題
・カスタイマイズのためのコードがよくわからん、それをどう調べる、なににあたればいいかがよくわからん。リファレンスの見方、メソッド、クラス、区分け、分類、などなどなど
・雑談bot
・ログ記録bot
・ライブラリとはなんぞや

Botを拡張・機能追加したいぞ
Botとして、これまでは一方的に投稿する形だったので、slackに投稿したものに対してアクションしていく動きをoutcomingでやっていきたい。

そして、たとえば、勤怠管理をスプシに記録したり、もくもく(勉強など)記録をスプシに記録して数値やグラフとして可視化したい。

聴講者の集計などにも利用、応用できると思う。


ひとまず、ここまでできた自分とてもえらい!!!!天才!!!!



いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!