見出し画像

NightBot と Google Spread Sheet を使って、おみくじ機能をつくるぞ(Google Apps Script 不使用)

追記修正 2023/01/25:バグ発生の可能性があったため、数式を修正


以下の動画が、やりたいことです。



つまりはおみくじ機能です。
自分は、「カラオケのマイリストを気楽に作って、
コマンドでランダムに選曲する」、
というのをやりたくて作りました。
対戦よろしくお願いします。



Q. 他にもっと簡単な〇〇って方法があるよ!
A. うるせー馬鹿




0. はじめに


おみくじ機能みたいなやつは、みんなやってて自分もやりたかったけど、
やり方がよくわからなかったので、
色々調べて NightBot + スプレッドシートのみでできるように弄りました。
気になったら読んでみてください。
他の方法は 🤔 でした。

  • PASTEBIN を使う方法 → 生のテキストよりスプレッドシートでまとめた方が書きやすいし見やすくない?

  • Google Apps Script を使う方法 → 準備もコード書くのも勉強するのもめんどくさくさ~。使いたくない。

  • なんかサービス使う方法(TriggerFyre とか)→ やりがたあるのがどうがもわがんね。


以下の用意は、もう出来てるもんだと思って話を進めます。

  • Google アカウント作成

  • Twitch アカウント作成

  • NightBot アカウント作成

  • NightBot と Twitch との連携


注:
NightBot は Twitch、Youtube で使えますが、
今回のおみくじのやり方は Twitch じゃないと実質使えませんでした(理由は後述)。

Youtube でおみくじ機能を使いたい場合は、
PASTEBIN を使う方法でできると思います。

ただ、PASTEBIN を利用する場合でも、
スプレッドシートから自動リスト生成するところは活用できると思うので、
4 章あたりまでは、よかったら読んでみてください。



1. Google Spread Sheet の API を有効にする


最初に、スプレッドシートの API を有効にします。
↓ の記事を読んだら出来ます(初手他人任せ)。


とりあえず、以下の2つができてれば OK です(記事中の手順 2 まで)。

  • スプレッドシートの API の有効化

  • API キーの作成

記事の途中でアプリケーションの制限について書かれていますが、
自分のやり方だと、設定なしでしか動きませんでした。
(ちゃんと動く設定方法があれば教えてください)

まあ大丈夫じゃないですか。しらんけど

この時もらえる API キーが、後々必要になってきます。



2. Google Spread Sheet を用意する


次に、新しいスプレッドシートを用意してください。
共有設定も忘れずしましょう(先ほどの記事の手順 3 に書いてます)

「空白」選んだら、なんかでてくるよ
共有設定を忘れず
設定しよう


そして、ここで「リンクをコピー」をクリックすると共有リンクが取得できます。
この URL のスプレッドシート ID の部分が、API キーと併せて、今後必要になってきます。

https://docs.google.com/spreadsheets/d/[スプレッドシート ID]/edit?usp=sharing



3. Google Spread Sheet で、おみくじリストを手作りする


そうしたら、適当にリストを作りましょう。
シート名はなんでもいいです。


おみくじなら、こんなんでよい


自分のカラオケセットリストの場合は2列あります
趣味がバレる


この後の設定が全部終わってしまえば、
今後はこのリストをいじるだけで済むようになります。
凶を削除したり、末吉を追加したりしましょう。
楽々ちんちんだなァ~?



4. Google Spread Sheet で JSON を自動生成する


スプレッドシートで、新しいシート「JSON」を作成します。
JSON とは、適当にいうと .exe とか .txt とか、そういうやつです。

別に名前は「JSON」でなく、「シート2」でも「UNCHI」でも、
なんでもいいです。
でも、この後 URL を作成する時に、微妙にわずらわしいので、
日本語は使わず、アルファベットにするのが無難です。

新しいシートを作成
2バイト文字が入ってるとやだ


おみくじリストを既に作ってる場合は、
この JSON シートの A1 セルをクリックし、    
数式として以下の文字をぶち込みましょう。
(シート名を「シート1」から変えてる場合は、数式の中のシート名も置き換えてください)

// 1列(おみくじ)の場合

="["&
TEXTJOIN(
  ",",
  TRUE,
  ARRAYFORMULA(
    IF(
      'シート1'!$A1:$A<>"",
      """"&SUBSTITUTE('シート1'!$A1:$A, """", "\""")&"""",
      ""
    )
  )
)
&"]"


これをぶち込むと、こう表示されるはずです。

["大吉","中吉","小吉","凶","大凶"]
実は数式バーは広げられるし、数式は改行できるのじゃ


ここで欲しいのは
["大吉","中吉","小吉","凶","大凶"]
という文字です。
これは「大吉~大凶までが含まれたリストです」という情報を、
文字で表してます。


カラオケリストの方を作ってみたという人は、
以下の数式をぶち込んでみてください。

// 2列(カラオケリスト)の場合

="["&
TEXTJOIN(
  ",",
  TRUE,
  ARRAYFORMULA(
    IF(
      'セットリスト'!$A6:$A<>"",
      IF(
        'セットリスト'!$B6:$B<>"",
        """"
        &SUBSTITUTE('セットリスト'!$A6:$A, """", "\""")
        &" / "
        &SUBSTITUTE('セットリスト'!$B6:$B, """", "\""")
        &"""",
        ""
      ),
      ""
    )
  )
)
&"]"
長い

こっちは ["歌手名1 / 曲名1", "歌手名1 / 曲名2", "歌手名2 / 曲名1"…] みたいな文字になってると思います。 

ここで自動生成した文字は、
PASTEBIN を利用する方法でも活用できます。
手作業で書くより大分楽になるでしょう。

これ手で書こうとしたら大変よ


Q. 数式書いてもエラーがでるが?
A. 動作確認してますが、エラーがでることもあるかもしれません。
数式が何やってるか、ある程度わかってた方がよいです。
数式を読んで、各自で修正してください。

あと「ex. 数式について」という項目に解説を書いたので読んでください。
本編より書くのがしんどかったです。
読んでください。
読め❤


Q. この式、無駄がありすぎじゃない?
A.



5. リストを取得する URL を用意する


先述した情報をつなぎ合わせて、URL を紡ぎだします。

  • スプレッドシート ID

  • API キー

  • シート名

以下の URL の該当箇所を、それぞれ置き換えて、
ブラウザのアドレス欄にぶち込みましょう。
上手くいっていれば、さっき作った文字が表示されます。

https://sheets.googleapis.com/v4/spreadsheets/[スプレッドシート ID]/values/[シート名]?key=[API キー]

¥マークがついてますが、正常です
何文字までいけるのかは、わかりません


Q. なんかエラーって書いてるよ。
A. API 設定が無効になってないかとか、URL が間違ってないかとか確認してください。

例:存在しないシートの名前を入れた時にでるエラー



6. NightBot のコマンドを作る


NightBot を開いて、Command を開いて、コマンドを作成して、
Message の項目に以下の文字をぶち込みましょう。

// Message の項目
$(eval v=
  JSON.parse(
    decodeURIComponent(
      `$(querystring $(urlfetch json [作成した URL]))`
    )
  ).values[0][0];
  l=JSON.parse(v);
  l[Math.floor(Math.random()*l.length)]
)

// 1行で書く場合
$(eval v=JSON.parse(decodeURIComponent(`$(querystring $(urlfetch json [作成した URL]))`)).values[0][0];l=JSON.parse(v);l[Math.floor(Math.random()*l.length)])


// 文字を追加したい場合
おみくじ:$(eval v=JSON.parse(decodeURIComponent(`$(querystring $(urlfetch json [作成した URL]))`)).values[0][0];l=JSON.parse(v);l[Math.floor(Math.random()*l.length)])


[作成した URL] の部分は、こんな感じで置き換えてください。

decodeURIComponent(
  `$(querystring $(urlfetch json https://sheets.googleapis.com/v4/unkounkochinchin/values/JSON?key=oshikkooshikko))`
)

余談ですが、NightBot でコマンド書くの、読みづらいし動作確認しづらいしマヂムリチンポマンバカタレマンふざけるなよアンポンタン。


先ほど、シート名に日本語があるとめんどくさい、と書きました。
それは、NightBot のコマンド内に URL を書き込む際に、日本語がそのまま書いてあるとエラーになってしまうからです。

だめな例
https://sheets.googleapis.com/v4/unkounkochinchin/values/シート2?key=oshikkooshikko

URL に日本語を挟む場合は、URL エンコードをしないとダメなのです。
(おそらく最近の)ブラウザはそのまま日本語表示されてたりしますが、
それはブラウザが勝手にやってくれてるだけです。
優秀です。

OKな例(シート名がシート2の場合)
https://sheets.googleapis.com/v4/unkounkochinchin/values/%E3%82%B7%E3%83%BC%E3%83%882?key=oshikkooshikko

なななな~なななな~、エンコード、めんど

でも、Chrome なら、アドレス欄の URL をコピペすると、
勝手にエンコードしてくれたりします。
便利だね。
Edge はダメでした。
素敵だね。

この辺の確認が面倒であれば、
あるいは、↑で書いてる意味がよくわからなければ、
シート名は最初からアルファベットにしときましょう。


他の項目はこんな感じです。

Message の部分、読みづらくなるので、
テキストファイルに書いて保存しといた方がよいです


今回はコマンドを !omikuji としたので
Twitch のチャット欄にそのまま !omikuji と打ち込めば、
おみくじ機能のできあがりです。

注意:
テスト中は、UserLevel を Owner にしましょう。
Everyone にしてると、自分以外がコマンドを叩いた時も動いてしまいます。


超注意:
Message に入力した式がおかしいと、
基本的にはエラーが表示されますが、
ものによっては、チャット欄に URL がそのまま書き込まれたりする場合があります。
そうなると URL に含まれた API キーが他人にモロバレしてしまうので、
その場合は速やかにチャット欄を削除しましょう。
(チャット欄に /clear と打ち込んで送信すれば履歴が消えます)


補足:
初めの方で Youtube だと、今回の方法は使えない、と書きましたが、
それは NightBot の Command の入力文字数が、
Youtube だと 200 文字になってるからです。
(Youtube 配信のチャット文字数制限が 200 文字なので)

作成した URL を短縮 URL にすれば、200 文字以内に収まるでしょうが、
API キーが含まれた URL を短縮するのは、まー危険だと思います。
PASTEBIN 使いましょう。



7. おわり


そういうわけで終わりです。
おつかれさまでした。

今回の方法は、スプレッドシートでまとめられることと、
Google Apps Script を使わなくていいところが気に入ってるところです。
数式もコマンドも記事もがんばって書いたので、
使えそうだったら使ってください。



Q. だから、他にもっと簡単な〇〇って方法があるよ!
A. 俺は外で泣く。







ex. 数式について


おま〇けです。
なげ~。


i. スプレッドシートの数式の解説


おみくじのやつを1から解説します。

="["&
TEXTJOIN(
  ",",
  TRUE,
  ARRAYFORMULA(
    IF(
      'シート1'!$A1:$A<>"",
      """"&SUBSTITUTE('シート1'!$A1:$A, """", "\""")&"""",
      ""
    )
  )
)
&"]"

行頭のこれ→ =

今からこのセルに書く内容は、数式ですよ、という宣言です。
例えばセルの中に、普通に「6+4」と書いても「6+4」と表示されますが、
「=6+4」と書けば「10」と表示してくれます。

表計算ツールだからね
セルを指定したら、セルの中身で計算してくれる!

行頭以外にも = は使いますが、効果は変わってきます。
各自調べてね。
以降も、このレベルの、この程度の解説になります。


これと→ "["

これと→ ""

これ→ """"

上から、"["、""、""""

" (ダブルクォーテーション)で囲んだ文字は、文字列です。
文字列というのは、数式の中で扱う文字のことです。
スプレッドシートの数式として、「="うんこ"」と打ち込めば、
= や " の表示が消えて、「うんこ」と表示されます。
そういうやつです。

"" と書くと、間に何の文字もないので、空白が表示されます。
これを空文字(からもじ)と呼びます。
よく使います。

" で囲むと、文字列になるなら、
" 自体を文字列にしたい場合はどう書いたらいいのか?
正解は ”” と2連続で書く、です。
なので「""""」と書けば「"」と表示されます。
他には「"うんこ""ちんこ"""」と書けば、「うんこ”ちんこ"」と表示されます。これをエスケープ文字と呼びます。
普通のプログラミング言語だと、エスケープ文字は \ (バックスラッシュ)、あるいはそれが文字化けして半角の¥表示になります。
なんで \ じゃねんじゃとキレる人がいたりしそうです。
俺です。


"["&
なんか
&"]"

& は文字列の連結に使うやつです。
「なんか」の部分は、例えば "HUGURI" という文字列が書いてあれば
[HUGURI] という表示されるでしょう。
普通のプログラミング言語だと、& じゃなく + が使われるので、
キレる人がいたりしそうです。
俺です。

色々できるね


A1

$A1

'シート1'!$A1

セルの指定方法は色々あって厄介です。
既に例として書きましたが、=A1 と書いた場合は、
同じシートのセル A1 の中に書いてある文字を表示します。

$A1 の $ の部分は、絶対参照というやつです。
とても重要な機能ですが、重要すぎて、この説明をするには余白が足りないので各自検索してください。
とても雑にいうと A1、$A1、A$1、$A$1 は全部同じことをしてます。
白って 200 色あんねん。

'シート1'!$A1 の「'シート1'!」は、例えばシート 2 からシート1 の A1 を見たい! という時に使います。
便利。
だけど書こうとするとめんどい。


おんなじだぁ


'シート1'!$A1:$A1000

'シート1'!$A1:$A

$A1:$A1000 のような書き方は範囲指定です。
A1~A1000 をドラッグした時のような状態になってます。
この範囲指定は直接セルの参照に使うことはないと思います。
大体、数式を組み合わせて使います。
なので、まともに取り組もうとすると、よくわからなくなってきます。

$A1:$A と書くと、A1~A の最後の行までを範囲指定したことになります。
この記事を書き終わった後にその書き方を知ったので、
$A1:$A1000 と書いてた部分を涙ながらに書き直しました。

B1, B4, C3 全て「=A1:A」と入力してるが、全て出力が違う
あほくさ


修正前 → """"&'シート1'!$A1&""""

修正後 → """"&SUBSTITUTE('シート1'!$A1:$A, """", "\""")&""""

note 公開後にバグが見つかって、追記修正した箇所です。
文章として修正が漏れてたらごめんなさい。

SUBSTITUTE は、文章の中にある指定した文字を、全て別の文字に置き換える処理です。
ここでは「"」とついてる箇所を「\"」と置き換えています。
この処理を行わないと、例えばリストで「大吉」ではなく「”大吉”」と書いた場合、NightBot 側での処理でエラーを起こします。

これは先述した、エスケープ文字に関連するバグですね。
" をそのまま使おうとするとバグってしまう処理があるのです。
私はカラオケリストに、Shuta Sueyoshi feat. ISSA の Over "Quartzer" を追加したらエラーが発生し、バグってることに気づきました。
ISSA、ゆるさん。



IF(
  'シート1'!$A1<>"",
  """"&'シート1'!$A1&"""",
  ""
)

説明の都合で少し数式を削ります。
""""&SUBSTITUTE('シート1'!$A1:$A, """", "\""")&"""" と書くのも無駄に長いので、""""&'シート1'!$A1&"""" と書いときます。

IF は if 関数です。
条件にあってれば """"&'シート1'!$A1&""""、あってなければ "" を表示する、という分岐する処理になってます。
RPG ツクールとかでいじったでしょ? アレよ。

'シート1'!$A1<>"" は条件式です。
つまりここでは「シート1 の A1 に書いてる文字は、空文字ではない」という意味です。
<> は演算子の一種で、比較演算子といいます。検索しようね。

A1 に「ちんぽ」と入力した場合は、条件は真となるので、
""""&'シート1'!$A1&"""" が表示されます。
つまりこのセルには「"ちんぽ"」と表示されます。
A1 に何も入力されてない場合は、条件は偽となり、
空文字が表示されます。
つまり何も表示されていないように見えます。

ただただ、""""&'シート1'!$A1&"""" と書いてしまうと、
A1 が空文字だった場合に「""」と表示されてしまって、
なんか変な感じになるのを防いでるわけです。

A1 に大吉と入力されてるので、
IF は真となり、B2 に"大吉”と表示される
A1 空欄なら、B1 も空欄


IF(
  'シート1'!$A1:$A<>"",
  """"&'シート1'!$A1:$A&"""",
  ""
)

今度はさっきと違って範囲指定されています。
これだけだと、数式を書いたセルの位置で結果が変わったり、エラーがでたりとよくわかりません。
この範囲指定は ARRAYFORMULA と組み合わせることで効果があります。

ARRAYFORMULA(
  IF(
    'シート1'!$A1:$A<>"",
    """"&'シート1'!$A1:$A&"""",
    ""
  )
)

何書いてるかよくわかりませんね。
端的に画像で表すとこうなります。

←生テキスト / 数式を通した結果→

上記の ARRAYFORMULA~の数式は、
画像でいうところの B1 に書いただけです。
B2~B5 には数式を書いてませんが、"中吉"、"小吉"… と書かれています。
この範囲表示が ARRAYFORMULA の便利でわけわからん力です。
IF 関数の中で範囲指定してるのも、ARRAYFORMULA でうまく動かすためです。

B1 にはこんな感じで数式を入力していて
B2 以降の値も、ここから出力している
B2  に直接手打ちしてるように見えるが
B1 の処理で "中吉"と表示されてるため
B2 を削除しても、一瞬で更新される


もし IF 関数で範囲指定していない場合はどうなるか?

ARRAYFORMULA(
  IF(
    'シート1'!$A1<>"",
    """"&'シート1'!$A1&"""",
    ""  )
)

”大吉”しか表示されない→→
リスト表示されてないね

よくわかんないけど、そういうもんだと思いましょう。
分数の割り算を習った時も、分子と分母をひっくり返すんだと言われて、そういうもんなんだ、と納得したでしょう。
そういうもんです。
納得しなかった人は、数学者の素質があるので、こんな記事読んでないで勉強してください。



TEXTJOIN(
  ",",
  TRUE,
  ARRAYFORMULA(
    IF(
    'シート1'!$A1:$A<>"",
    """"&SUBSTITUTE('シート1'!$A1:$A, """", "\""")&"""",
    ""
    )
  )
)

そして最後はこれ。
簡単に言うとリストの中身を「,」でがっちゃんこしてます。

←これが ↓こうなって こうじゃ→

2 番目の引数に TRUE が指定されていますが、
これは空のセル(=空文字のセル)を無視する設定です。
これがないと、こうなってしまいます。

ワァ…ッ!

'シート1'!$A1:$A と範囲指定してるせいで、スプレッドシートの全行が範囲になっちゃってます。
'シート1'!$A1:$A5 と書けばこんなことにはなりませんが、
そうすると吉、末吉と新しいおみくじを追加した時、
いちいち 'シート1'!$A1:$A6、'シート1'!$A1:$A7 と書き換えないといけなくなります。
それを防ぐための 'シート1'!$A1:$A なんです。
ようできとる。


というわけでスプレッドシート解説終わりです。
わかりましたか?
わかったら手を挙げて教えてください。
挙げなくてもいいよ。




ii. NightBot のコマンドの解説


正直本当にわからん。
NightBot 独自の書き方と JavaScript が混じってるっぽいので。
ので、適当な解説になります。

こちらの記事のコマンドの方がシンプルなので、
こっちから解説します。

$(eval a=$(urlfetch json 【PASTEBINURL】);a[Math.floor(Math.random()*a.length)])

$(eval なんか) 

$(eval なんか) は、「なんか」の部分に書いてるプログラムコードを実行するやつです。
NightBot でプログラム的なことをする時は、この中に押し込めてます。


$(urlfetch json 【PASTEBINURL】);

URL 先が JSON 形式なら、それを JSON オブジェクトにしてくれます。
わかりづらいね。

【PASTEBINURL】は PASTEBIN の URL で、それをブラウザで叩くとこんな表示になります。

PASTEBIN でこう書くと
URL を叩いたらこう取得できる

この場合、【PASTEBINURL】は ["大吉","中吉","小吉","凶","大凶"] という文字列を持ってることになります。
$(urlfetch json) は、その文字列を  ["大吉","中吉","小吉","凶","大凶"] というリストのデータ(配列)に変えてくれたわけです。


a=$(urlfetch json 【PASTEBINURL】);

なので、a=$(urlfetch json 【PASTEBINURL】); と書いた場合は、
a という変数の中に、 ["大吉","中吉","小吉","凶","大凶"] という配列が代入されたことになります。
変数とか代入という言葉くらい、言わなくてもわかるよなァ~?

ちなみに、; (セミコロン)は、1行の処理の終わりに書く記号です。
「。」と同じですね。


a[数値]

a.length

配列は、配列[0] と指定すると、配列の 0 番目の値を取得できます。
["大吉","中吉","小吉","凶","大凶"] だと、0 番目は "大吉" です。
a.length は、配列の長さを取得します。
["大吉","中吉","小吉","凶","大凶"] の長さは 5 となります。

もし a[a.length] と書いたらどうなるか?
a[5] を指定したことと同じになりますが、["大吉","中吉","小吉","凶","大凶"] に 5 番目の値はないので(”大凶" は a[4])エラーになります。
a[3.2] とか実数を入れても、そんなもんないのでエラーです。


Math.floor(Math.random()*a.length)

Math.random は 0 以上 1 未満の実数をくれる関数です。
0.47713332418790544 とか 0.5068253297882568 とかがランダムで出てきます。

Math.floor は、与えられた数値以下の最大の整数をくれます。
もし、Math.floor(Math.random()) と書いた場合は、
Math.random() の値は必ず 1 未満の数になるので、
0 しか返ってきません。
意味ねえな?

しかし、Math.random()*a.length と書くことで、
「0 以上 1 未満 × 配列の長さ」という計算になるため、
配列の長さが 5 なら、「0 以上 5 未満の実数」が出てくるようになります。
これを Math.floor で囲むと「0 以上 5 未満の整数」がランダムで出てきます。
天才やん。

JavaScript で確認
できとるな!


a[Math.floor(Math.random()*a.length)]

ということで、上記の処理は、
["大吉","中吉","小吉","凶","大凶"] というリストから、
0 以上 5 未満の整数をランダムで指定して、中身を取り出す、
という処理になるわけです。
長かったね。


おみくじ:$(eval a=$(urlfetch json 【PASTEBINURL】);a[Math.floor(Math.random()*a.length)])

ちなみにこう書くと、
「おみくじ:大凶」
みたいに表示されます。
「おみくじ:」は $eval() の外側に書いてるから、ただの文字列扱いですね。

スプレッドシートの時みたいに、文字列連結のための & とかを書く必要がないです。
これは NightBot 的な書き方なので、気にしすぎないようにしましょう。



以上は、PASTEBIN から取得した JSON をいじるコマンドでしたが、
次はスプレッドシートから取得した JSON をいじるコマンドです。
これで最後よ。

$(eval v=
  JSON.parse(
    decodeURIComponent(
      `$(querystring $(urlfetch json [作成した URL]))`
    )
  ).values[0][0];
  l=JSON.parse(v);
  l[Math.floor(Math.random()*l.length)]
)

`$(querystring $(urlfetch json [作成した URL]))`

なんかさっきと書き方違いますね。
これだけを実行した場合は、これが返ってきます。

%7B%20%20%22range%22%3A%20%22'%E3%82%B7%E3%83%BC%E3%83%882'!A1%3AZ9580%22%2C%20%20%22majorDimension%22%3A%20%22ROWS%22%2C%20%20%22values%22%3A%20%5B%20%20%20%20%5B%20%20%20%20%20%20%22%5B%5C%22%E5%A4%A7%E5%90%89%5C%22%2C%5C%22%E4%B8%AD%E5%90%89%5C%22%2C%5C%22%E5%B0%8F%E5%90%89%5C%22%2C%5C%22%E5%87%B6%5C%22%2C%5C%22%E5%A4%A7%E5%87%B6%5C%22%5D%22%20%20%20%20%5D%20%20%5D%7D

これをデコーダにかけると、こうです。

おみくじの JSON が出てきた

` (グレイヴアクセント)を抜いたり、$(querystring) を抜いたりするとエラーがでるので、スプレッドシートの URL 特有のやり方なんでしょう。
これ以上はめんどくさいので調べません。


JSON.parse(
  decodeURIComponent(
    `$(querystring $(urlfetch json [作成した URL]))`
  )
)

decodeURIComponent は、上記のデコーダと同じ処理をかましてるということですね。
JSON.parse は、デコードした JSON 形式の文字列を、JSON データとして扱えるようにしています。
中身としては以下のようになってます。

こういうデータがとれてる


$(eval v=
  JSON.parse(
    decodeURIComponent(
      `$(querystring $(urlfetch json [作成した URL]))`
    )
  ).values[0][0];

JSON データの中に values という名前のデータがあるので、
.values と書けばその中を参照できます。
values の中は配列の入れ子構造になってるので、
さらに .values[0][0] と書いてるわけです。
.values[0][0] の中には、念願の ["大吉","中吉","小吉","凶","大凶"] が入ってます。
そのデータを変数 v の中に閉じ込めました。


l=JSON.parse(v);
l[Math.floor(Math.random()*l.length)]

["大吉","中吉","小吉","凶","大凶"] をもう一回 JSON.parse してます。
1回パースしたのにもう一度パースしており、これが正しいかわからないですが、動いてるのでヨシ!
動作確認しづらい NightBot が悪い。
考えるのめんどくさいです。
記事書いてるだけでしにそう。
パースした後はランダム取得処理を書いてフィニッシュ。




以上で解説も終わりです。
お疲れさまでした。
俺が。

いいなと思ったら応援しよう!