4

有没有办法检查谷歌应用脚​​本中的内置类型?我不知道如何访问内置类型的构造函数。所以我不能使用 instaceof 运算符。

例如配置文件(https://developers.google.com/apps-script/class_analytics_v3_schema_profile

function getReportDataForProfile(profile) {
if (profile instanceof Profile) // Profile is undefined...
...
}

还有什么有点令人困惑:当我得到一个 Profile 实例时(在变量配置文件中)

profile.constructor // is undefined
4

3 回答 3

10

观察输出后Logger.log(),很明显对于大多数内置 Google Apps 对象,toString()方法的输出是类名:

var sheet = SpreadsheetApp.getActiveSheet()
if (typeof sheet == 'object')
{
    Logger.log(  String(sheet)     ) // 'Sheet'
    Logger.log(  ''+sheet          ) // 'Sheet'
    Logger.log(  sheet.toString()  ) // 'Sheet'
    Logger.log(  sheet             ) // 'Sheet' (the Logger object automatically calls toString() for objects)
}

所以上面的任何一个都可以用来测试对象的类型(除了最后一个显然只适用于 的例子Logger

于 2013-09-26T02:35:30.793 回答
1

似乎这不一定是一个干净的解决方案,但它仍然可以正常工作。

如果是 Profile 对象,则profile.getKind()返回analytics#profile. 但是,如果.getKind()没有为该对象定义方法,则会引发错误。所以看起来你必须做 2 次检查。

if (typeof profile.getKind != "function") {
  if (profile.getKind() == "analytics#profile") {
    //profile is a Profile!
  } else {
    //profile is some other kind of object
    //use getKind() to find out what it is!
  }
} else {
  //profile doesn't have a getKind method
  //need a different way of determining what it is
}
于 2013-03-11T20:03:08.320 回答
0

在某些情况下,“in”可用于通过其属性验证对象:

function CheckType( fileOrFolder ) {
  if ( "getName" in fileOrFolder )
    if ( "getFiles" in fileOrFolder ) return "folder" ;
    else if ( "getBlob" in fileOrFolder)  return "file" ;
  return "neither file nor folder" ;
}

function ShowType( Obj ) {
  let Type = CheckType( Obj ) ;
  console.log( "%s is a %s", "getName" in Obj ? Obj.getName() : Obj.toString(), Type ) ;
}

ShowType( DriveApp.getFiles().next() )   ;
ShowType( DriveApp.getFolders().next() ) ;
ShowType( DriveApp ) ;
于 2020-08-29T12:25:55.603 回答