🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

839閲覧

javascriptでtwitterキーワードを取得しgoogleスプレッドシートで比較・抽出する

spa

総合スコア52

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/02/01 04:00

前提・実現したいこと

javascriptでtwitterキーワードを取得しgoogleスプレッドシートで比較・抽出する
プログラムを書いている際につまづきました。
解決法を教えていただける方、よろしくお願いします。

発生している問題・エラーメッセージ

TwitterキーワードJSONを取得しスプレッドシートに書き込んだあとの「文字列比較」がうまくいきません。
A列とC列を比較し、A列のキーワードがC列の文章に含まれる場合、C列をそのまま返すようにしたいです。
いまのプログラムでは完全一致になってしまい、キーワード同士の一致したものしか取り出すことができません。(文章の中にキーワードがある場合は抽出できていない)

イメージ説明

該当のソースコード

javascript

1function isContain() { 2 3 var sheet = SpreadsheetApp.getActive().getSheetByName("twitter1"); 4 var keywordA = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues(); 5 var titleC = sheet.getRange(1, 3, sheet.getLastRow(), 1).getValues(); 6 7 var xxx = keywordA.filter(function(e){return titleC.filter(function(f){return e.toString() == f.toString()}).length > 0 }); 8 9Logger.log(xxx) 10 11}

試したこと

Google検索して解決しようと思いましたが、力及ばずでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

js

1var xxx = keywordA.filter(function(e){return titleC.filter(function(f){return e.toString() == f.toString()}).length > 0 });

無名関数が入れ子になっている箇所ですが、自力で追えないなら
ワンライナーで一気に書かずに↓こんな感じに分解して確実に処理するべきと思います。

ログも追加したのでどこの判定が質問者さんの意図と違うのか分かると思います。

js

1 var xxx = keywordA.filter(function(keyA){ 2 return titleC.filter(function(keyC){ 3 // BUG: ここが完全一致判定になっている。部分一致を調べるにはどうしたらいい? 4 let result = keyA.toString() == keyC.toString(); 5 6 Logger.log(`${result ? 'o' : 'x'}: keyA=[${keyA.toString()}], keyC=[${keyC.toString()}]`); 7 return result; 8 }).length > 0 9 });

ヒント追記

js

1let hoge = 'アイエェー、ニンジャナンデニンジャ'; 2let fuga = 'ニンジャ'; 3let piyo = 'にんじゃ'; 4 5Logger.log(hoge.indexOf(fuga)); // 6 と出力 6Logger.log(hoge.indexOf(piyo)); // -1 と出力

頑張ってください。

投稿2021/02/01 08:26

編集2021/02/01 09:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spa

2021/02/01 08:58

回答いただきありがとうございます。おかげさまで間違っている箇所がわかりましたが、まだレベルが低いのでどう修正すればよいかわかりませんでした。 let result = keyA.toString() == keyC.toString(); で同じ文字列のみを比較してしまっているのはわかりましたが、部分一致を表す不等号は存在しない?ので、String.prototype.includes()を使って判定をしないとダメなんでしょうか。
退会済みユーザー

退会済みユーザー

2021/02/01 09:08 編集

発想を変えましょう。AとCを直接比較する必要はないです。 これがStringで使える機能ですが、この中のAPI1つに元の文字列に対して、指定した文字列が含まれる場合に何文字目にあると知ることができます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String それから、Webを有効活用しましょう。 めっちゃ出てきますよ? https://www.google.com/search?q=javascript+%E9%83%A8%E5%88%86%E4%B8%80%E8%87%B4+%E6%96%87%E5%AD%97%E5%88%97&oq=javascript+%E9%83%A8%E5%88%86%E4%B8%80%E8%87%B4+%E6%96%87%E5%AD%97%E5%88%97&aqs=chrome..69i57.11936j0j7&sourceid=chrome&ie=UTF-8
spa

2021/02/01 09:14

ありがとうございます。両方のページとも自分で検索して見つけてはいたのですが、なかなかうまく行かなくて困っていました。 もうちょっと発想を変えてみます。
退会済みユーザー

退会済みユーザー

2021/02/01 09:22

いやいや、全然読んでないでしょw 1つ目のURL開いたらスクロールさせずにAPI名と機能概要が書いてあるので見つけられます。 API名をクリックすると次のページでは動作するサンプルが見られます。 リファレンスは正直うんざりするのも分かるんですが、もう少し頑張りましょう。 APIが分かったら、その結果が【-1じゃない時】は【部分一致している】という判断をすればOKです。
spa

2021/02/01 09:36

すみません。読んではいたのですがどうも頭が堅くて応用が効かないのです・・・ 「文字列の中の部分文字列の存在や位置をチェックする indexOf() メソッド」を使って-1以外が返ってくれば「キーワードが入ってるぞ」という判断をする、ということですよね? 違ったらすみません。
退会済みユーザー

退会済みユーザー

2021/02/01 09:41

その認識で合っていますが、【先にコードを手元で書いて、自分の目で動きを見て】 それで想定通りならそれで良し。そうでなかったらそれを踏まえて再質問をする。 その方がご自身の学習の為にも良いと思います。 頑張ってください。
spa

2021/02/01 12:04

let result = keyC.toString().indexOf(keyA.toString()) !== -1 && keyA.toString().length >1 && keyC.toString().length >1; ヒントをいただいたので完成させることができました。ご指導いただきありがとうございます。 空白同士は一致させない処理もなんとか文字数のカウントで対処できました。 感謝です(^^)
退会済みユーザー

退会済みユーザー

2021/02/01 12:32 編集

解決できたようで何よりです。 ただ、コードの1行の長さが気になりますね…。 目安として3項を超えるようなら分割して整理した方がプログラムがスッキリし、拡張がしやすくなります。 > let result = keyC.toString().indexOf(keyA.toString()) !== -1 && keyA.toString().length >1 && keyC.toString().length >1; 【keyCを文字列にしてKeyAを文字列にしたものを部分検索して見つからず、かつkeyAを文字列にした時の長さが2以上で、かつkeyCを文字列にした時の長さが2以上になった時は真】 このプログラムを日本語にした文章だって意味を把握するのって大変だと思います。 変数の名前の付け方にも気を回せると格段に読みやすくなります。 --- // 値を文字列に変換する let strKeyA = keyA.toString(); let strKeyC = keyC.toString(); // キーワードを含んでいるかどうか let isExist = strKeyC.indexOf(strKeyA) !== -1; // strKeyAとstrKeyCの両方が2文字以上になっているかどうか let isExceed = (strKeyA.length > 1) && (strKeyC.length > 1); // 結果 let result = (isExist && isExceed); --- > 空白同士は一致させない処理もなんとか文字数のカウントで対処できました。 多分、空白2文字以上とかそういう時に対応できなくなりそうです。 Stringクラスのtrim()を使うと、文字列の最初と最後の空白文字等が除去した文字列を取得できます。 その上でlength=0の時は除外する処理をした方が良さそうですね。 すでに長文コメントになっているので、これで終わります。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問