【问题标题】:How to get the object type如何获取对象类型
【发布时间】:2014-01-07 00:11:41
【问题描述】:

在我的 Google Apps 脚本应用中,我看到以下错误:

脚本完成,但返回值不是支持的返回类型

如何找出我返回的值的类型?我试过了:

typeof(obj)

但我得到的只是它是一个对象。

此错误仅在缓存为空且从电子表格加载数据时发生。例如。用户点击页面,得到错误,刷新现在加载页面,因为缓存在第一次点击时被填充。现在用户可以继续使用该页面,直到缓存失效,然后下一次命中将再次导致此错误。

在我阅读并关注this document 后,今天开始出现此错误。以前我的脚本在模板中加载数据,现在我已经重构为异步加载:

google.script.run

我查看了我的页面中发生的情况,了解为什么它在从缓存中读取时会起作用,我唯一能看到的不同之处是缓存中的数据是从 JSON 字符串中解析的。当缓存为空时,我必须对对象进行字符串化以便保存到缓存中,因此我没有返回我的原始对象,而是解析我刚刚创建的字符串并返回它,现在没有错误了。

我不确定错误来自哪里,是 Apps Script 还是 Caja?

解析 JSON 字符串以返回也不是理想的解决方案,这个字符串化/解析对我的原始对象做了什么来消除错误?

当我使用内置调试器检查对象(在字符串化/解析过程之前和之后)时,值和类型似乎都与我所能检查的能力相同。

这是 Apps 脚本中的错误吗?难道我做错了什么?消除此错误的最佳解决方案是什么?

【问题讨论】:

    标签: javascript google-apps-script google-sheets typeerror


    【解决方案1】:

    我们可以扩展 JavaScript 对象,让它们告诉我们它们的对象类型,如 How do I get the name of an object's type in JavaScript? 所示。不过,这不适用于 Google Apps 脚本对象。

    这是我整理的一个似乎适用于 GAS 对象的 hack。我没有尝试过每一个,但一些主要对象确实有效。

    function getObjType(obj) {
      var type = typeof(obj);
      if (type === "object") {
        try {
          // Try a dummy method, catch the error
          type = obj.getObjTypeXYZZY();
        } catch (error) {
          // Should be a TypeError - parse the object type from error message
          type = error.message.split(" object ")[1].replace('.','');
        }
      }
      return type;
    }
    

    这是一个测试例程:

    function test_getObjType() {
      var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      Logger.log("Spreadsheet: " + getObjType(spreadsheet));
      var sheet = spreadsheet.getActiveSheet();
      Logger.log("Sheet: " + getObjType(sheet));
      var range = sheet.getActiveCell();
      Logger.log("Range: " + getObjType(range));
      var string = "Hello";
      Logger.log("String: " + getObjType(string));
    };
    

    结果:

    [13-12-18 23:23:47:379 EST] Spreadsheet: Spreadsheet
    [13-12-18 23:23:47:609 EST] Sheet: Sheet
    [13-12-18 23:23:47:626 EST] Range: Range
    [13-12-18 23:23:47:626 EST] String: string
    

    【讨论】:

    • getObjType() 自 2021 年 2 月 22 日起似乎不再起作用。从“catch”返回的错误消息字符串如下所示。 5:58:02 PM Info Spreadsheet: obj.getObjTypeXYZZY is not a function5:58:02 PM Info Sheet: obj.getObjTypeXYZZY is not a function5:58:02 PM Info Range: obj.getObjTypeXYZZY is not a function5:58:02 PM Info String: string
    • 错误类型错误:无法读取未定义的属性“替换”
    【解决方案2】:

    我知道这是一篇非常古老的帖子,但我想让每个发现自己遵循 Google 推荐的人都知道该解决方案不再有效。

    我在同样的问题上苦苦挣扎,并尝试了建议的解决方案。看起来 Google 已经(再次)决定在不告知任何人或更新文档的情况下更改其产品的功能。

    错误消息不再包含对象类型,因此我们得到的是“TypeError: Cannot find function foobar in object ”,而不是“TypeError: Cannot find function foobar in object”。

    很可能错误消息总是使用 toString() 方法,并且由于 Google 从 toString() 方法中删除了对象类型,他们也破坏了这种获取对象类型的方式。

    我只需要确定对象是数组还是字符串,然后找到解决此问题的 hack。

    function getObjType(obj) {
      
      // If the object is an array, this will return the stored value,
      // if the object is a string, this will return only one letter of the string
      var type = obj[0];
      if (type.length == 1) {
        return 'string';
      }
      try {
        type = obj.foobar();
      } catch (error) {
        
        // TypeError no longer contains object type, just return 'array'
        Logger.log(error);
        return 'array';
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多