見出し画像

[GAS×slack]名言Botの別解version、indexOfでどうにかしてみる。

これまでのあらすじ

「ぜんぜんわからない。俺たちは雰囲気でGASをやっている」
俺たちは名言botの作成を通して、GASの基本を学ぼうとしていた。
slackにbotを召喚することに成功したが、botのカスタマイズやコードの改変に手を出そうとしていた。

★これまでの宿題

・プロパティ
・カスタイマイズのためのコードがよくわからん、それをどう調べる、なににあたればいいかがよくわからん。
・雑談bot
・ログ記録bot
・ライブラリとはなんぞや
・indexOf ←New! いまこれ。


本題

GASでbot送信済みか否かを判別する例では、whileでもfor/breakでもなく、条件分岐のないものはindexOfを使う方法もあるのでは?とコメントをいただき、うんうん唸りながら試してみた。

まだ理解が浅いが、恐らく基礎の習得や今後を見据えてwhileやfor/breakを使用していたが、高速化を見据えるとindexOfという手法もあるのかもしれなかった。データサイズ(何万行もあるとか)や何をしたいかによってこの辺は変わってくるのかもしれない。ひとまず、ものは試しでindexOfしてみる。

画像1

こんな感じである。

読み解いてみる。

あれ、そういえば。

const rng=sheet.getRange("D:D")

のように、=の前後は空白スペースなくてもOKなんだろうか?動いているっぽいが。

さて、置き換える部分に着目してコードを書き換える。元とは別のファイルを設けた。

 ​

function meigen02({
 const sheet = SpreadsheetApp.getActiveSheet(); //sheetの定義 SpreadsheetAppでコンテナバインドでアクティブなシート
 const lastRow = sheet.getLastRow(); //最終行の定義 先に定義したsheetの最終行
 
 const rng=sheet.getRange("D:D")//範囲の定義、指定。ここではD列に今後追加していくことも想定してD:Dとした。
 const vals = rng.getValues()//const rng で指定した範囲の値。
 console.log(vals)//const rng で指定した範囲の値をconsole.logで確認。

 const valsf = vals.flat() //★ここが良く分からない。
 var index=valsf.indexOf('')//indexOf('') で上からみていって空白の値の行数を返す。
 console.log(index)//var index の値をconsole.logで確認。上から0,1,...と数えることに注意。

}

このへんまでわかってきた。

const valsf = vals.flat()

ここが良く分からない。
indexOf GASでググったらタカハシさんの記事があった。流石や......。

これか?! flatメソッドか?

?????

なんか一回読んでもよくわかんないな~~~。前提として、二次元配列のままでは扱いづらいので、一次元化するとあり、うーん。「二次元配列 GAS」でググって最初に出てきたページに目を通してみる。

ふむ。console.log(valsf)でみたほうがわかりやすそう。

画像2

こういうことだ。何行目かindexで数えてもらうためにflatに平たく並べたかんじだろうか。この配列の考え方はこの後も詰まりそう。いったんこの理解で先に進む。上から見ていって、空白行が何行目か判定できたので、それをもとに値を取得して、slackに投稿する、というコードを書いていきたい。

値の取得

getValueでどうにかするんだと思う。このへんはもともとの名言botのコードを再利用できそう。とか思ってたら、めちゃくちゃ詰まった。

結果としては下記のコードで意図した動きになった。

  const body = sheet.getRange(index, 1).getValue();
 console.log(body)
 sheet.getRange(index+14).setValue(true); //trueをシートにsetする
 if(index >= lastRow) {
   sheet.getRange(24, lastRow).clearContent();
   }
   }


何に詰まったかというと、数の数え方だった。
indexは0基点スタートで数えているが、Rangeは1基点で数えているようだった。なんでだ。なんか理由があるはずだがわからない。
ノンプロ研のみなさんに助けていただいた。本当に感謝。

slackに投稿

ここまでくれば勝つる。投稿用コードは流用して差し込んでいく。

画像3

できた~~~~~!!!!!

やった~~~~~~~~!!!!!

寝よう!


あ、rangeには0範囲がないからか?




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