LoginSignup
3

More than 3 years have passed since last update.

GASのV8では [JavaObject] が [Object] になる

Last updated at Posted at 2020-02-17

概要

GAS で V8ランタイムが使えるようになった件について:(V8 Runtime Overview)

G Suite Services の FoobarApp 系オブジェクトは
Object.prototype.toString.call() でタイプ名を取得すると
従来の Rhino では [object JavaObject] が返ってきましたが・・・

V8ランタイムに切り替えると [object Object] になります。

確認

function foo(){
  var objects = {
    calendar : CalendarApp.getDefaultCalendar(),
    folder   : DriveApp.getFolderById( 'root' ),
    file     : DriveApp.createFile( 'test', '' ),
    document : DocumentApp.create( 'test' ),
    spread   : SpreadsheetApp.create( 'test' )
  }

  for ( item in objects ){
    console.log( item + ' : ' 
      + Object.prototype.toString.call( objects[ item ] ) );
  }
  /*
  --- Rhino ---
  calendar : [object JavaObject]
  folder : [object JavaObject]
  file : [object JavaObject]
  document : [object JavaObject]
  spread : [object JavaObject]

  --- V8 ---
  calendar : [object Object]
  folder : [object Object]
  file : [object Object]
  document : [object Object]
  spread : [object Object]
  */
}

影響

[object Object] になることで、従来使えなかったメソッドが使えたりします。
例えばプロパティ名の列挙に使う Object.getOwnPropertyNames()

function bar(){
  var obj = CalendarApp.getDefaultCalendar();
  console.log( Object.getOwnPropertyNames( obj ).length );
  /*
  --- Rhino ---
  TypeError: オブジェクト型の引数が必要ですが、object 型が返されました。
                         ↑ 何言ってんのお前
  --- V8 ---
  28.0
  */
}

注意

型名チェックに === '[object JavaObject]' などとやっている場合は
挙動が変わるので修正が必要です。

その他

従来の Rhino から V8 へ切り替える為のポイントがまとめられていますが
この件についてはどこにも記載を見つけられませんでした。少なくとも今は。

Migrating scripts to the V8 runtime
(Qiita) GASがV8エンジンに対応したのでドキュメント読んだ

以上

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3