Yahoo Japanのテレビ番組表がリニューアルされて、番組のデータがJSONで取得できることを発見したので、google apps scriptで試してみると、UrlFetchApp.fetchのHTTPリクエストのヘッダにちょっとパラメータを追加すると、取得できた。JSONデータの中にelementという項目があり、いわゆる囲み漢字の"🈑"のような文字がセットされていた。Windows10もiPhoneも表示できるのだが、どうしてもフォントのサイズの都合でつぶれて見えるので、"[字]"のように変換しようとしたのだが、文字のコードをcodePointAtで取得しようとすると、
TypeError: オブジェクト 🈑 で関数 codePointAt が見つかりません。
というようなエラーが出る。実際のコートはこんな感じ。
var tbl = { '127490':'サ', '127504':'手', '127505':'字', '127506':'双', '127507':'デ', '127508':'二', '127509':'多', '127510':'解', '127511':'天', '127512':'交', '127513':'映', '127514':'無', '127515':'料', '127516':'前', '127517':'後', '127518':'再', '127519':'新', '127520':'初', '127521':'終', '127522':'生', '127523':'販', '127524':'声', '127525':'吹', '127526':'演', '127527':'投', '127528':'捕', '127529':'一', '127530':'三', '127531':'遊', '127532':'左', '127533':'中', '127534':'右', '127535':'指', '127536':'走', '127537':'打', '127538':'禁', '127539':'空', '127540':'合', '127541':'満', '127542':'有', '127543':'月', '127544':'申', '127545':'割', '127546':'営' }; function convert_kakoi (s) { return s.replace(/(..)/g, function(v) { var code = v.codePointAt (0); if ( code in tbl ) { return '[' + tbl[code] + ']'; } else { Logger.log ("convert_kakoi: not defined in tbl " + code); return v; } }); }
実験のために新たなスプレッドシートで色々試してこのようになったのだが、そこでは動くのに、大本のスプレッドシートで試すと、「codePointAtは見つかりません」のエラーが出る。なぜだかわからず色々試していたのだが、どうやらJavaScriptのランタイムがv8になっていないとcodePointAtは定義されていないようなのだ。もともとのスクリプトのランタイムはRhinoにしていて、それは、HTMLテンプレートでメールの内容を作るときに、output.appendを使っていたからなのだ。ランタイムをv8にするとappendが未定義になってしまう。この問題に関しては、以下のページを見つけて解決できた。
大本のスプレッドシートもランタイムをv8にすることで無事codePointAtが使えるようになったが、google apps scriptとcodePointAtをキーワードにして検索しても、全然ヒットしなくて、google apps scriptでcodePointAtは需要がないのだろうか?
2022/5/7追記
最近403エラーが出て、JSONデータが取得できないことが発生する場合があり、ページデータを保存して理由を見てみたら、
【お知らせ】欧州経済領域(EEA)およびイギリスからご利用のお客様へ - Yahoo! JAPAN
だった。なんとなく米国からアクセスしていると思っていたのだが、場合によってはEEAからのアクセスになるようだ。なので、google apps scriptでYahoo Japanのテレビ番組表の取得は現実的な方法ではなくなった。