Google Apps Script V8 Runtime (自分用) チェックリスト

Google Apps Script の [V8 Runtime](https://developers.google.com/apps-script/guides/v8-runtime)が、リリースされてました。
メインで使っているスクリプトへの影響がなかったので、放置していましたが、
新しく作るときに向けて、簡単なチェックリストにしておこうと思います。




## ワークアラウンド
スクリプトエディタのメニューバーから、[実行]-[Chrome V8 を搭載した新しい Apps Script Runtime を無効にする]を選択して、スクリプトを保存する。
※V8にするときは、逆に「有効」にする。

## チェックリスト
### Features of the V8 runtime (機能エンハンス)
* *[Modern ECMAScript syntax](https://developers.google.com/apps-script/guides/v8-runtime#modern_ecmascript_syntax)* モダンな ECMAScript構文がサポートされた。
  * (とりあえず、) varじゃなくて、let と  const を使う。

* *[Improved function detection](https://developers.google.com/apps-script/guides/v8-runtime#improved_function_detection)* 関数定義の改善。
  * いずれ。。

* *[Call object methods from triggers and callbacks](https://developers.google.com/apps-script/guides/v8-runtime#call_object_methods_from_triggers_and_callbacks)* トリガーとコールバックから、オブジェクトメソッドを呼べるようになった。
  * いずれ。。

* *[UI changes for logging](https://developers.google.com/apps-script/guides/v8-runtime#ui_changes_for_logging)* ログ見るときのUIが変わった。
  * 使ってるうちに慣れていくでしょう。

* *[UI changes for executions](https://developers.google.com/apps-script/guides/v8-runtime#ui_changes_for_executions)* 実行するときのUIが変わった。
  * 使ってるうちに慣れてくでしょう。

### Incompatibilities (非互換項目。直さないとエラーになるやつ)
* *[Avoid for each(variable in object)](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_for_eachvariable_in_object)* for each(variable in object) は使っちゃダメ。コード保存時にSyntax Erorになる。
    * for (variable in object) を使う。  

* *[Avoid Date.prototype.getYear()](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_dateprototypegetyear)*  getYear()使っちゃダメ。結果が今の年から1900を減算したのになる。
  * getFullYear() を使う。


* *[Avoid using reserved keywords as names](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_using_reserved_keywords_as_names)* 予約されたキーワードは使っちゃダメ。
  * [予約語](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords)は使わない。

* *[Avoid reassigning const variables](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_reassigning_const_variables)* const で宣言した変数の値を変えちゃダメ。TypeErrorになる。
  * const で宣言した変数の値を変更しない。

* *[Avoid XML literals and the XML object](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_xml_literals_and_the_xml_object)* XMLリテラルとかXMLオブジェクトを直接使っちゃダメ。
  * XMLの解析には、XmlService を使う。

* *[Don't build custom iterator functions using \_\_iterator\_\_](https://developers.google.com/apps-script/guides/v8-runtime/migration#dont_build_custom_iterator_functions_using_iterator_)*<br> カスタムイテレータを作るのに、\_\_iterator\_\_ 使っちゃダメ。
  * ES6 のイテレータを使う。 

* *[Avoid calling functions before they are parsed](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_calling_functions_before_they_are_parsed)* 関数呼ぶときは予め解析しとかないとダメ。
  * 複数のファイルに分けてスクリプトを書いた場合、別のファイルにある関数を呼ぶ前に解析しておく。 

* *[Avoid conditional catch clauses](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_conditional_catch_clauses)* catchの中に条件文を書いちゃダメ。
  * catch の中の条件分を外に出す。

* *[Avoid using Object.prototype.toSource()](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_using_objectprototypetosource)* Object.prototype.toSource() は未サポート。
  * Object.prototype.toSource() を削除する。

<br>

### Other differences (その他の変更。結果が変わったりするやつ。)

* *[Adjust locale-specific date and time formatting](https://developers.google.com/apps-script/guides/v8-runtime/migration#adjust_locale-specific_date_and_time_formatting)* Dateの toLocaleString(), toLocaleDateString(), and toLocaleTimeString() は動きが変わってる。
  * 上記メソッドは、確認して必要に応じて修正する。 

* *[Avoid using Error.fileName and Error.lineNumber](https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_using_errorfilename_and_errorlinenumber)* Error オブジェクトは未サポート。
  * Error.fileNameとError.lineNumber を削除する。

* *[Adjust handling of stringified enum objects](https://developers.google.com/apps-script/guides/v8-runtime/migration#adjust_handling_of_stringified_enum_objects)* JSON.stringify()やるとき、enumオブジェクトは名前が変えるようになってる。
  * JSON.stringify()  は、確認して必要に応じて修正する。

* *[Adjust handling of undefined paramaters](https://developers.google.com/apps-script/guides/v8-runtime/migration#adjust_handling_of_undefined_paramaters)* メソッドに undefined を渡すと null を渡したのと同等になった。
  * undefined を渡しているところは、確認して必要に応じて修正する。

* *[Adjust handling of global this](https://developers.google.com/apps-script/guides/v8-runtime/migration#adjust_handling_of_global_this)* グローバルthis は動きが変わってる。
  *  確認して、必要に応じて修正する。