3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SteinでSpreadSheetからデータを複数条件(AND)でとって動的にメッセージを作成

Last updated at Posted at 2020-11-30

#「今日飲みに行きたい人」を募るLINE Botを作っています

タイトルを汎用的なものに言い換えると、
「DBからデータを抽出して、配列を作るよ。」
です。

飲みに行く人を誘いにくい状態が続きますが、
もう少し落ち着いたら、対策はしたうえで飲みに行くこともありそうですね。
社内など、__知らない人もある程度混じっているコミュニティ__で、
「今日飲みたい」と思ったときに誘えるLINE Botを作っています。

こんなサービスを実際に__誰かに動くところを見ていただきたく__て、
使う人が「飲みに行きたい」とやったら、その人の名前(あらかじめ登録した)が出る。
という基本部分だけとりあえず動的に動くようにしました。

今までは、固定の人に対して送るようにしていましたが、
実際に自分の名前が出たほうが楽しくなるかと思い、今回の対応をしました。

ただ、飲みに行く人数は4人一組にしたかったのですよ。そこで、
image.png

このような形で、日にち・何番のグループ・何人目というデータを作りました。


// 最後に登録した人が所属するグループに入っている名前を取得して格納
let userNameList = await store.read(tranSheet, { search: { date: today, group_no: groupNo.toString() } }).then(data => {
                        return data
                    }).catch(e => console.log(e))

今日、かつ、グループNoを指定して、そのグループにいる人たちを取得します。
抽出した人たちを宛先にセットして、

let pushText;
pushText += " グループの飲みに行くメンバーは、"
// 同じグループの人数分ループ
for(var i = 0 ; i <= userNameList.length - 1 ; i++ ){
   pushText += userNameList[i].user_name + "さん、";
}
pushText += "です!張り切っていきましょう!"

このような形でメッセージを作ります。そのメッセージを最終的にチャンネルに登録されている方たちに絵文字を文末につけて配信。


let textLength = pushText.length;
pushText += "$";

// チャンネルに登録されている方たちに連絡
await client.broadcast([{
    "type": "text",
    "text": pushText,
    "emojis": [
        {
            "index": textLength,
            "productId": "5ac1bfd5040ab15980c9b435",
            "emojiId": "002"
        }
    ]
},{
    type: "sticker",
    packageId: "11537",
    stickerId: "52002745"
}]).then(data => console.log(data))
.catch(e => console.log(e))

#構成
image.png

LINEでメッセージを送ると、Node.jsで受け取って処理する。
その際、Steinを使って、SpreadSheetをDB代わりに、
 append(INSERT) 飲みに行きたい人追加や名前登録
 search(SELECT) 今日飲みに行きたい人のグループを抽出
 delete キャンセル
 update 名前の更新

#今回つまったポイント 複数条件の設定
Steinというサービスを使って、Google Spread Sheetをテーブルとして使ってデータを入れたり出したりしています。

参考URL Stein

複数条件指定したときに、なぜかデータが0件だったり、2つ目の条件が効いてないという現象が起きた。。
そもそものSteinのメソッドを呼び出すときの書き方の問題なのか、
複数条件を設定できない仕様なのか。(DBとしてそんなことはまずないだろうと思ってはいた。)

複数条件でデータ抽出できたメモ

気を付けよう。以下のポイント
・SpreadSheet とってくるときは__文字列型__。数値型で入れたのにな!!SpreadSheet上も数値のよう。右寄せなので。
・Node.js 数値型。次のグループNoなど足し算をしたかったので数値で取り扱っています。最初、何も気にしなかったら文字列型になっていて、2+1→21になっていた。笑

#反省としてJavaScript特有?の型のあいまいさをどうするか考えていく
今回の考察として、そもそものSteinの構文で、
複数条件を指定した例がなかなか見つからなかった+公式ドキュメントを見ると書いてあるが、推測通りなのかわからなかった。
(たぶんJSONみたいな指定だから、2つ目の条件はカンマで区切って書くよな・・・と理解はしていた。)

そのため、別の理由で間違ってても構文が間違ってる!?と思い込んでしまっていた。
実際は、型が誤っていてデータをとれなかった。型をうまく変換できてなかったなどが理由だった。

今後の方針として、文字列型なのか数値型なのかは、ちゃんと都度値が取れているかで判断するか、明示的に__型指定__してから扱おう。
と学んだ。
この考え方はif文の条件とかでも使えそう。「==」で判断するのか、「===」で判断するのかの違い。
みなさんどうやってるんだろう。

今回全体のソースは長すぎるので、ひかえておきます。。。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?