けものフレンズBBS NEO

フレンズ検索アプリを作りたい

275 コメント
views
89 フォロー

フレンズ検索アプリを作るスレ
開発予定地
https://japari-search.netlify.com/
フレンズ登録フォーム
https://goo.gl/forms/hU548UrMOMSChs9v2
仮一覧
https://docs.google.com/spreadsheets/d/1A_U2n4puTNDb_6ZC3zjpHybOnxzWT0uniPxliy3ybPc/edit?usp=sharing
全てはこのレスから始まった。
そろそろフレンズ検索ソフトが欲しいな、作ろうかな。
https://zawazawa.jp/minmi/topic/193
のレス377より)
で、実際に作りたいと思います。
現在Fusion Tableとgoogle apps scriptによる
webアプリケーションとしてのリリースを検討しています。
意見よろしくです。

ひねもす
作成: 2018/03/02 (金) 23:06:31
最終更新: 2018/04/01 (日) 23:54:59
通報 ...
118
名無しのフレンズ 2018/03/06 (火) 12:08:26 f416c@49a72

じゃあ自分もア行やってたんで、そのままで

119
ひねもす 2018/03/07 (水) 20:40:51 修正

APIの規格を策定せねば
>> 87ことむさしさんどのようなAPIがやりやすいですかね。
{項目名=値,項目名=値,項目名=値,…}を入力して
{名前,名前,…}を出力するって形式でいいですか?
他にご所望の関数ってありますか?

120
むさし 2018/03/07 (水) 21:13:35 修正 >> 119

リクエストは検索条件のパラメータ(指定なしの場合はパラメータなし)で、レスポンスは配列で中にオブジェクトでフレンズの情報を持つ方法がいいと思います。
リクエストは具体的には以下のような感じです。

{
  'type': 1,
  'can_swim': 1
}

レスポンスは具体的には以下のような感じです。

[
  {
    'id': 1,
    'name': 'サーバルキャット',
    ...
  },
  {
    'id': 2,
    'name': 'カラカル'
    ...
  }
  ...
]

あとリクエストはjsonでいいでしょうか?
jsonで渡すとGASでjsonをオブジェクトに変換しないといけないと思います。
クエリパラメーター(よく http://hoge.com/user?id=10 みたいにurlの後ろに付いている?以降のパラメーターです。)でやった方がGAS側でオブジェクトに変換してくれるみたいなのですが、いかがでしょうか?
これはサーバー側の実装に関わるところなので、ひねもすさんにお任せします。
私の方はどちらでも問題ないです。

122
ひねもす 2018/03/07 (水) 22:21:42 >> 120

そうですね、JSONでお願いします。
パラメータの名前はサーバサイドでは
名前name
媒体oldapp,comic,stage,stageeqlv,apvilion
アニメの項目AOP,A1,A2,A3,…A12
ショートアニメbasuteki,keiba,fukkura,anisama
能力swim,fly
旧属性oldapptype
分類liffeclass,lifeorder,lifefamily,lifegenus
となっております。
できる/登場した=1,できない/登場してない=-1としていただけるとありがたいです。
オブジェクト配列了解しました。

123
ひねもす 2018/03/07 (水) 22:23:24 >> 120

そういやidふってなかったけど、必要ですかね。
名前が確実に被らないので大丈夫と思ったりもしますが。

127
むさし 2018/03/07 (水) 22:42:56 修正 >> 120

>> 122falseは一般的には0を使うと思うですが、-1でないといけない理由はありますか?
特にないなら0がいいですね。負の数はなるべく使わない方が安全です。
>> 123なくてもいいですが、あった方が管理しやすいと思うのですがどうでしょうか?
一意に特定出来ればいいので、DBに入った順くらいの認識でいいと思います。
変更フォーム作成した時に名前だとうちミスがあることを考えてidあった方がいいかなと思いました。
そういう意味ではクライアントのリクエストに入れる必要はないですね。

128

あと、リクエストにjson使う場合だとメソッドはPOSTなので、気をつけてください。

130
ひねもす 2018/03/07 (水) 22:49:59 >> 120

なるほど、不明=0にしてたんですよね。
クエリで送られる際は不明は省略されますからtrue = 1, false = 0でお願いします。
あとid付与しときます。

134
むさし 2018/03/07 (水) 22:59:36 修正 >> 120

>> 130すみません。さっき修正して、

そういう意味ではクライアントのリクエストに入れる必要はないですね。

なので、idはこちらへのリクエストには不要です。
管理的にあると便利だと思うのでそれに関してはひねもすさんの方で決めてしまって大丈夫です。
なるほど、不明は-1が一番多いような気がしますね。
確か今フォームには不明が選べるので検索結果で返すことになると思うのですが、どうしますか?

136
ひねもす 2018/03/07 (水) 23:10:04 >> 120

慣例に則ったものにした方が安全ですね。
true = 1 false = 0 unknown = -1
でお願いします。
現在データベースに上がっているものは書き直しとなりますが
元のスプレッドシートが残っているので
データベースを一回消去して一括挿入しときますのでご安心ください。

146

>> 136
了解しました。
ちなみにフロントはjqueryとかで作った方がいいでしょうか?
他の人でもメンテナンス出来るようにと考えるとjqueryがいいかなと考えています。

151
ひねもす 2018/03/08 (木) 00:19:29 >> 120

メンテナンス性の高さ大事なので
jqueryでお願いします!

152

了解です。

124
アデリーペンギン 2018/03/07 (水) 22:30:23

以下のコンテンツに登場したか? [ガイドブックn巻]
とかがあってもいいのでは?

125
アデリーペンギン 2018/03/07 (水) 22:34:15 >> 124

いや、重複して登場することはないからガイドブック何巻に登場したか?のほうがいいですかね

126
ひねもす 2018/03/07 (水) 22:34:49 >> 125

なるほど、追加要素は別途フォーム作ろうかな。
他に追加したい要素ありますか?(入力が大変になっていく気がするけど)
あと、ある程度出来上がったら、変更用フォームも作らねば。

129
アデリーペンギン 2018/03/07 (水) 22:46:31 >> 125

表で[不明]ってなってるところを一覧で出してわかる(マン)が訂正するシステムとか…いいんじゃないでしょうか

131
ひねもす 2018/03/07 (水) 22:56:16 >> 125

せやな、
ところでアテソーベソキソとは一体…

132
アデリーペンギン 2018/03/07 (水) 22:57:31 >> 125

手が滑って打ち間違えました

133
ひねもす 2018/03/07 (水) 22:59:28 修正 >> 125

なるほど、検索時に混乱するから残しておくね

135
アデリーペンギン 2018/03/07 (水) 23:03:22 >> 125

そ、そうでありますかー

137
ひねもす 2018/03/07 (水) 23:12:48 修正 >> 125

冗談です。真面目なデータベースにしないと利用者に怒られるので消去しときますね。
おふざけ要素入れたデータベースを別に作っとこうかな。
そのときになったらまたよろしくです。

追記
てっきり動物名の方に入れたのだと見間違えました。セーフです。

139
ひねもす 2018/03/07 (水) 23:20:30 >> 125

ごめんなさい、アカウント名が動物名だったので
フレンズ名と登録者名で混乱しちゃいました。
あとで復旧しときます。

141
アデリーペンギン 2018/03/07 (水) 23:30:41 >> 125

ああ、そういう...
検索時に混乱するってなんだ?って思ってました
アデリーちゃんのデータベースは既に書かれてたのですよ

138
ひねもす 2018/03/07 (水) 23:19:05

【事前連絡】
データの更新、書式の変更などがございますので近いうちにフォームを一回閉じて
作業します。ご理解願います。

140
名無しのフレンズ 2018/03/07 (水) 23:23:29 27a9d@7886a >> 138

了解です

142
名無しのフレンズ 2018/03/07 (水) 23:39:56 27a9d@7886a

(そういえばHAW-206はエイチエーダブリューだったか。五十音順ミスったかな)

143
アデリーペンギン 2018/03/07 (水) 23:42:16 >> 142

ストーリー中ではハウちゃんでしたけどね…判断が難しいところです
まあ結局全部データベースに入れるんですし気にすることはないかと

145
名無しのフレンズ 2018/03/07 (水) 23:50:03 27a9d@7886a >> 143

確かに読みは関係ないですからね。
まあ、いっか!(自棄)

144
ひねもす 2018/03/07 (水) 23:46:05

なんかコードが出来上がっちゃったんでいまちょっと閉鎖します。

147
ひねもす 2018/03/08 (木) 00:11:27

再開しました!

148
ひねもす 2018/03/08 (木) 00:12:35

途中で44個のリクエストをサーバちゃんに送ったら
多すぎるよ!って怒られた。

149
むさし 2018/03/08 (木) 00:14:45

無料だと制限辛そうですね。

150
ひねもす 2018/03/08 (木) 00:18:24

うん、まあ流石にfor文回して一気に入れるのは無理があったので、
10個ずつ小分けしました。
今回の更新で
true = 1 false = 0 unknown = -1となり
アテソーベソキソ名義の登録内容も復旧
idも入れた順に付与するように設定

めでたしめでたし

153
ひねもす 2018/03/08 (木) 00:35:30

https://qiita.com/minodisk/items/934903a937813fcf1e30
によると
1日25,000 リクエスト数/日
ざっくり25000回検索できることですな。
他の機能でゴリゴリ使わなければ、ですが。

154

GASのurlfetchは20000回らしいので問題ないですね。
それ超える規模のアクセスあったら、我々ではどうしようもないですし。

155
ひねもす 2018/03/11 (日) 16:51:50

大喜利大会が終わったら作業再開します。
(帰省中なんですが、ブルーライトカット眼鏡持ってき忘れたから
パソコン作業がつらいぜ。)

156
ひねもす 2018/03/12 (月) 21:14:00

作業再開!関数鋭意制作中
検索関数の名前はjaparesearch()としました。

157
名無しのフレンズ 2018/03/12 (月) 21:56:24 3a49b@eb1f1 >> 156

Japariじゃないんですか?

158
ひねもす 2018/03/12 (月) 22:36:09 >> 157

japari + researchで
iとeどっちにするか迷ったんですがiの方がいいですか?

159
たべないでください⁽˙³˙⁾◟( ˘•ω•˘ )◞⁽˙³˙⁾ 2018/03/12 (月) 22:40:24 >> 157

japari + search = Japarisearch
の打ち間違いかと思ったのですが、researchだったんですね。

161
ひねもす 2018/03/12 (月) 22:45:11 >> 157

そっか、researchだと研究になって意味が変わってしまう。
Japarisearch()
にします。

160
ひねもす 2018/03/12 (月) 22:43:52 修正

>> 120【ムサシさんへ業務連絡】←書いとくべきでした。
なんか関数完成したっぽい。明日体裁整えて公開します!

162
ひねもす 2018/03/13 (火) 17:41:52

https://script.google.com/macros/s/AKfycbww1A3I6qIiJZ4eT6Hy-dlCGTtifADzVkTD5YxmJ8D2iX7BBS8p/exec
で公開しました!不具合は随時修正していきます。

163
名無しのフレンズ 2018/03/13 (火) 19:20:19 e626b@43a20 >> 162

”needs your permission to access your data on Google”の”data on Google”って具体的にどんなことなの?

164
ひねもす 2018/03/13 (火) 19:52:20 >> 163

およ?調査します。

165
たべないでください⁽˙³˙⁾◟( ˘•ω•˘ )◞⁽˙³˙⁾ 2018/03/13 (火) 19:56:55 >> 163

そのURLを踏んだ後、そのメッセージが出てgoogleアカウントのサインインが求められる。
サインインしても繰り返しメッセージが表示されて抜け出せない…
ちなみにiOS safariです。

166
アデリーペンギン 2018/03/13 (火) 19:59:59 >> 163

上に同じくです
Windows10 Chromeです

167
ひねもす 2018/03/13 (火) 20:00:37 修正 >> 163

ああ、すみません。この関数はそのままでは使えないのです。
ムサシさんが担当するwebpageのjavascriptから呼び出されて使えるようになりますので
しばらくお待ちください。
本当に関数だけが設置されている状態なんです。(表示方法とかそういうものが一切ない)

168
たべないでください⁽˙³˙⁾◟( ˘•ω•˘ )◞⁽˙³˙⁾ 2018/03/13 (火) 20:05:32 >> 163

そういうことだったのか…
もうできたのかと思って舞い上がってしまったよよよ

172
ひねもす 2018/03/13 (火) 20:41:25 >> 163

誤解させてすみません。
今、段階は「検索ページの作成」と「関数の拡張」に移った、って感じです。
全フレンズデータ入力も含めると完成は結構後になりそう。

169
むさし 2018/03/13 (火) 20:32:03

>> 162
今確認しましたが、公開設定が出来ていないかもしれません。
APIとして叩けないです。
少なくとも僕の方では確認できませんでした。

https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja
これでご自身でapi叩いてみてもらえますか?
下の画像のように、メソッドをPOSTにしてurl入れるだけで大丈夫です。
画像1
google driveがうんちゃらとかhtmlで帰ってきたら、おそらくうまくいっていないです。
画像1

170

ちなみに正しく公開設定出来ているのになぜか動かない場合は、私も以前同様のことがあり、その時はスクリプトを新しく作り変えたらうまくいきました。

171
むさし 2018/03/13 (火) 20:40:42

ちなみに私の方は全く手をつけていないので、もう少しお待ちを。。。

173
ひねもす 2018/03/13 (火) 20:42:50 >> 171

趣味の話ですので気長になさってください。
ちょっとAPI確認してきます。

174
ひねもす 2018/03/13 (火) 21:03:26

役に立ちそうな情報を発掘(メモ代わり)
http://ytyaru.hatenablog.com/entry/2017/01/05/000000

175
ひねもす 2018/03/13 (火) 21:18:23 >> 174

ただいま実験中、APIが使えそうになったら連絡します~。

176
ひねもす 2018/03/13 (火) 21:59:32 修正

テストです(協力お願いします)。このリンクをふんだら表示の先頭に

[{"name":"サーバルキャット"

ってなりますか?ついでにいうとOP登場フレンズだから「めぇ探偵」とか「博士」が来るはずです。
https://script.google.com/macros/s/AKfycbww1A3I6qIiJZ4eT6Hy-dlCGTtifADzVkTD5YxmJ8D2iX7BBS8p/exec?AOP=1

177
ひねもす 2018/03/13 (火) 22:06:14 >> 176

うまく表示されるなら、あとは一行コメントアウトするだけで
本格的に動けるようになるはず・・・。
「はず」が多いな~

178
胃中フレンズ(本垢)★★★★★★★ 2018/03/13 (火) 22:16:00 >> 177
179
たべないでください⁽˙³˙⁾◟( ˘•ω•˘ )◞⁽˙³˙⁾ 2018/03/13 (火) 22:16:24 >> 176

[{"name":"サーバルキャッ
ト"
となってます。

180

私の方でも見れましたー

181
ひねもす 2018/03/13 (火) 22:31:47 修正 >> 176

よし!それでは、JSON形式に切り替えます。
これで関数として使えます(予定)
>> 162と一緒です。

182
ひねもす 2018/03/13 (火) 22:37:41 >> 181

ご協力ありがとうございました!

183
むさし 2018/03/14 (水) 01:10:15

>> 181
今度は別のエラーが出ているみたいです。
画像1

184
ひねもす 2018/03/14 (水) 08:51:08 修正 >> 183

すみません。オブジェクトをJSONに変換する処理を忘れてました。2時間内に修正します。
追記
return JSON.stringify(Data);に書き換えました。
現在クエリパラメーターで受け付けているのですが、それで大丈夫でしょうか?
web系はそこまで得意でないので用語が色々怪しくてご迷惑お掛けしております・・・。

185

了解です、家帰ったら確認してみます。
クエリパラメータでも問題ないです。

186
むさし 2018/03/14 (水) 21:55:42

>> 184
今再度確認したのですが、前と同じエラーが出るみたいです。
ひねもすさんの方では確認できましたか?

187
ひねもす 2018/03/14 (水) 22:04:31 >> 186

んー、同じエラーを吐きますねぇ。サポートされている戻り値ってなんでしょうか?
調べてみます。

188

ちなみにコード変えるたびに公開して、バージョンをあげていますか?
GASはバージョンあげないと、公開用のコードは更新されないみたいです。

189
ひねもす 2018/03/14 (水) 22:10:56 >> 187

もう更新しまくってver11まで来てます(泣)

190

なるほど。。。
一回コード見せてもらってもいいでしょうか?

191
ひねもす 2018/03/14 (水) 22:14:07 修正
function doGet(x) {
  var tableId = ##############################;
  var sql = 'SELECT * FROM ' + tableId;
  var e = {};
  if (typeof x === "undefined") {
    e = {};
  }else{
    e = x.parameter;
  }
  var SCount = 0;
  //
  if(Object.keys(e).length != 0){
    sql += ' WHERE';
  }
  Logger.log(x);
  var param = ['oldapp','comic','stage','stageeqlv','pavilion','AOP','A1','A2','A3','A4','A5','A6','A7','A8','A9','A10','A11','A12','basuteki','keiba','fukkura','anisama','swim','fly','name','oldapptype','lifeclass','lifeorder','lifefamily','lifegenus'];
  for(var i = 0; i < param.length;i++){
    if(i < 24){
      if(e[param[i]] != undefined){
        sql = sql + ' ' + param[i] + ' = ' + e[param[i]];
        SCount += 1;
        if(SCount > 0 && SCount < Object.keys(e).length){
          sql = sql + ' AND ';
        }
      }
    }
    else{
      if(e[param[i]] != undefined){
        sql = sql + ' ' + param[i] + ' = ' + '\'' + e[param[i]] + '\'';
        SCount += 1;
         if(SCount > 0 && SCount < Object.keys(e).length){
          sql = sql + ' AND ';
        }
      }
    }
  }
  var Rdata;
  sql = sql + ';';
  var res = FusionTables.Query.sql(sql);
  var Rdata = [];//返り値
  var Bdata = {};//バッファー
  var BdataS = {};
  var k = 0;
  var m= 0
  while(k < res.rows.length){
    for(var j = 0; j < res.columns.length;j++){
      for(var m = 0; m < param.length;m++){
        if(res.columns[j] == param[m]){
          Bdata[param[m]] = res.rows[k][j];
        }
      }
    }
    BdataS = JSON.parse(JSON.stringify(Bdata));
    Rdata.push(BdataS);
    k += 1;
  }
  return JSON.stringify(Rdata);
}
192
むさし 2018/03/14 (水) 22:22:56 修正 >> 191

多分戻りが違うからうまく動かないのだと思います。
GASの場合はStringなら ContentService.createTextOutput で戻りを返さないといけないはずなので。

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

気になるところはまだあるけど、まずはこれを試してみてください。。。

193
ひねもす 2018/03/14 (水) 22:26:41 >> 192

導入しました。いかがでしょうか?

194

取得出来ました!

195
ひねもす 2018/03/14 (水) 22:28:55 >> 192

ふぅ、良かったです。

196

ちなみに気になったので今後のことを考えて2点だけ。。。

1.

BdataS = JSON.parse(JSON.stringify(Bdata));

ここはなぜ一回stringにしたものを戻しているのでしょうか?
BdataのままRdataに入れて大丈夫だと思います。

2.whileとforどちらか統一した方がいいと思います。whileの方が無限ループバグが起こりやすいのでforを個人的にはおすすめします。

197
ひねもす 2018/03/14 (水) 22:47:59 >> 192

1.
Bdataで突っ込んだら参照渡しの関係でデータが狂うので、色々やった結果こうなりました。
2.
forで統一しときます。

198
むさし 2018/03/14 (水) 22:53:28 修正 >> 192

なるほど。
Bdataの初期化をwhileの中で行えば問題ないはずです。

199
ひねもす 2018/03/14 (水) 22:58:57 >> 192

了解、修正して正常動作を確認しました。

200
むさし 2018/03/14 (水) 23:03:18 修正 >> 192

よかったです。
ちなみに?name=1にするとエラーが返ってきますがこれは今のところこの状態で問題ないのでしょうか?
そもそも文字列だから1じゃないか。。。なんでもないです。。。

201
ひねもす 2018/03/16 (金) 23:36:13

今日の作業
サ行のジャガーまで、シから始まるフレンズって多いのね。

202
ひねもす 2018/03/18 (日) 20:33:30

お知らせ
効率化のためメンテナンスを行います。
しばらくフォームはご利用できません、ご了承ください。

203
ひねもす 2018/03/18 (日) 21:38:02

相談
前あげていただいたフレンズ一覧から
ざっくりとしたデータの代入をすることが可能になりまして、
フレンズの情報を旧アプリ以外に登場したかを「登場していない、できない」に固定
旧アプリの項目についてRGBの場合「登場した」、Nの場合「登場していない」に設定
生物分類を「未登録」に固定する感じで
後から正しいデータに書き換えでいいですか?

204

つまり、細かい情報は固定にして一旦先にデータだけ入れて、細かい情報は後で書き換えていくということでいいでしょうか?
私はそれで問題はないと思います。(時間がなくて全く登録作業出来てない私がいうのはなんですが…)