Blow Up by Black Swan

Google Apps Script(GAS)のエラーに対処する「TypeError: オブジェクト function Object() { [native code for Object.Object, arity=1] } で関数 values が見つかりません」

前回、スプレッドシートとGoogle Apps Script(GAS)、Cloud Functionsを組み合わせて定時に自動実行されるプログラムについて記事を書きました。今回は、その際にGASで引っかかったエラーについて記事を書こうと思います。原因はいたって簡単でしたが、日本語情報が少なかったのでこの機会に少しでも日本語のGAS情報を増やせればと思い、書くことにしました。一人でも多くの方の参考になれば幸いです。

1. つまずいたGASのエラー

今回つまづいたGASのエラーはこちらです。

TypeError: オブジェクト function Object() { [native code for Object.Object, arity=1] } で関数 values が見つかりません

このエラーはObject.values()メソッドを実行した時に発生しました。下記がGASのコード例です。Object.values()メソッドはオブジェクトのvalueを配列にまとめて返してくれるメソッドです。

function myFunction() {
  var test = {a: 'dog', b: 'cat'}  # オブジェクト
  Object.values(test);  # エラー発生箇所。[valu1, value2, value3,...]
}

2. エラーが発生した原因

この原因と解決策を探したところ、下記のように全く同じではないものの、似たようなエラーがいくつか見つかりました。

これらの記事はどれもObject.assign()メソッドを実行した時にエラーに遭遇した記事です。しかし、問題の原因は一緒でした。1つ目のstackoverflowへの回答を読むとわかるのですが、GAS、つまりGoogle Apps ScriptはJavaScriptの”様な”言語ではあっても、”全く”一緒ではない、ということです。そのため、Object.values()メソッドやObject.assign()メソッドなどが使えず、今回のエラーが発生したのでした。厳密に言えば、GASが必ずしもJavaScriptの最新バージョンに乗っ取っているわけではないということです。

3. エラー対応

このエラーに対処するには、Object.values()メソッドを使わずに同じ様な戻り値を得るコードを書くだけです。原因がわかった時はめんどくさそうだったのですが、意外に大した苦労もせず、コードを作ることができました。ポイントは、Object.keys()メソッドです。少しヘンテコな感じはしますが、Object.values()メソッドはGASでは使えない(エラーになる)一方で、Object.keys()メソッドはGASでも使うことができます。そのため、このObject.keys()メソッドとmap関数を利用することでObject.values()メソッドと同じ結果を得るコードを作ればよいだけでした。下記がそのコード例になります。

function myFunction() {
  var test = {a: 'dog', b: ''}

  //Object.values(test);
  keys = Object.keys(test)    # [a, b]
  values = keys.map(function(x) {
    return test[x];
  });
}

map関数は配列の各要素に順にアクセスし、決まった処理を行う関数です。変数keysにtestオブジェクトのキーを格納し、その各キーを取り出してtestオブジェクトのキーとしてバリューを取り出し配列としてまとめていく、という流れです。for分やforEach文などでも可能ですが、スッキリしたコードを書く上ではmap関数が最適だと思います。

蛇足. アロー関数について

ちなみにですが、アロー関数についてもまだ対応されていません。map関数などはアロー関数の形を取ることが多いですが、アロー関数の形で入力すると(実行時ではなく)保存時に「構文エラー(Syntax error)」が発生します。

なお、順次JavaScriptの新しいバージョンに対応できるようアップデートしていく様ですので、近い将来状況が変わっていくことが十分予想されます。

4. 最後に

今回はGASで出会ったエラーについてその原因と対処コードについてまとめました。GASは非常に使い勝手が良く今後VBAとの差をどんどん詰めていくと個人的に考えています。前回の記事ではCloud Functionsの関数を呼び出す程度の使い方でしたが、その他にグーグルフォームと連携したり、WEBアプリケーション(WEBサイト)を作成したりできます。スプレッドシートをDB替わりにすれば、使い勝手の良いアプリケーションを作れます(いずれWEBアプリケーションについても記事にしたいと思います)。このようなGASですが、情報が少ない部分もまだまだあるので、少しでもGAS情報を増やすのに貢献できればと思います。

読んで頂き、ありがとうございました。