Node.JsをつかってYouTube検索して動画のタイトルとURLをスプレッドシートに表示させるではurlで使えない文字(/や#などのurlとして特別な意味をもつ文字)で検索するとうまくいきませんでした。そこで今回はそれに対応させます。それからほかのスプレッドシートであってもGASで発行されるsebアプリのurlをおくれば誰でも検索結果を表示させることができるようにします。

encodeURI関数で変換できるか?

urlで使えない文字に該当する文字としては、< > # ” % : ? / @ ! $ & ‘ ( ) * + , ; = { } | \ ^ [ ]です。

JavaScriptでURIエンコードを行うのが encodeURI()関数ですが、どの文字にも対応しているわけではありません。実際にencodeURI関数を使ってみると

# : ? / @ ! $ & ( ) * + , ; = ‘ は変化しません。それ以外は

< %3C > %3E
” %22
% %25
{ %7B
} %7D
| %7C
\ %5C
^ %5E
[ %5B
] %5D

半角スペース %20
全角スペース %E3%80%80

のように置き換わります。

そのうえで # : ? / @ ! $ & ( ) * + , ; = ‘ をURLエンコードすると、以下のようになります。

# %23
: %3A
? %3F
/ %2F
@ %40
! %21
$ %24
& %26
( %28
) %29
* %2A
+ %2B
, %2C
; %3B
= %3D
‘ %27

そこで先に手動でencodeURI関数の影響をうけないものを置換しておいて、そのあとencodeURI関数でエンコードします。

デコードするのであれば

replaceAll関数がサポートされていない場合

古いバージョンのNode.jsだとreplaceAll関数がサポートされていません。そこで置換元の文字列で対象の文字列を分割して、置換先の文字列をはさんで結合させます。

これだとエンコード・デコードする処理は以下のようになります。

urlで使えない文字で検索したときもYouTubeの検索結果を取得できるようにする

Node.js側の処理ですが、検索結果を取得するためのurlは https://www.youtube.com/results?search_query=keywordなのでエンコードが必要です。そうでないと「C#」で検索したとき期待している結果が取得できません。

それからGASで発行されるsebアプリのurlをおくれば誰でも検索結果を表示させることができるようにします。

GAS側の処理

ボタンを作成してボタンがクリックされたらfunc1関数が実行されるようにしておきます。urlはWebアプリとしてデプロイしたときに発行されるurl、herokuAppUrlはhttps://boiling-spire-97714.herokuapp.comを指定してください。

ボタンをクリックすると、H4セルに書かれているキーワードでYouTube検索をして、H5セルに書かれている数の件数だけ結果を取得・表示します。

Node.js側の処理

main関数を変更し、ManualEncoding2関数、ManualDecoding2関数、ReplaceAll関数を追加します。あとはNode.JsをつかってYouTube検索して動画のタイトルとURLをスプレッドシートに表示させると同じです。