隠居日録

隠居日録

2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。日々を読書と散歩に費やす

google apps scriptでcodePointAtはv8ランタイムじゃないと使えない?

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が未定義になってしまう。この問題に関しては、以下のページを見つけて解決できた。

qiita.com

大本のスプレッドシートもランタイムをv8にすることで無事codePointAtが使えるようになったが、google apps scriptとcodePointAtをキーワードにして検索しても、全然ヒットしなくて、google apps scriptでcodePointAtは需要がないのだろうか?

2022/5/7追記
最近403エラーが出て、JSONデータが取得できないことが発生する場合があり、ページデータを保存して理由を見てみたら、

【お知らせ】欧州経済領域(EEA)およびイギリスからご利用のお客様へ - Yahoo! JAPAN

だった。なんとなく米国からアクセスしていると思っていたのだが、場合によってはEEAからのアクセスになるようだ。なので、google apps scriptでYahoo Japanのテレビ番組表の取得は現実的な方法ではなくなった。