【问题标题】:Sets and data structures in Google Apps ScriptGoogle Apps 脚本中的集合和数据结构
【发布时间】:2017-01-05 09:54:40
【问题描述】:

Google Sheets 的脚本编辑器似乎是 JavaScript 的变种,但我不知道如何使用它来处理 Sets、字典等。我已经知道如何使用 JS 数组,但数组不是足以完成我的任务

通过正常方式声明一个集合(即var categoryOptions = new Set(String); 给我一个“集合未定义”错误。

使用var categoryOptions = {}; 不允许我使用任何内置的Set 函数,例如add。相反,我得到:“TypeError:在对象 [object Object] 中找不到函数添加。”

任何专业提示?

【问题讨论】:

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


    【解决方案1】:

    Google Apps 脚本在 Rhino 上运行。 Rhino 是相当落后的,它大约是 ECMAScript 5.1 级别。不要期望有任何 ES6 特性,例如集合或箭头函数。

    在 Rhino 的 GitHub 存储库中有一个关于 Set 的 open issue。但即使它已经实施,谷歌也不会在他们的服务器上部署新版本的 Rhino。

    【讨论】:

    • 感谢您的回答!是否有任何官方参考资料(例如文档)我可以引用说 Rhino 是 Google 用于 GAS 的?
    • 我认为没有。在GAS issue tracker 中搜索“rhino”会出现一些报告,其中引用了“com.google.apps.maestro.rhino.WrappedException”错误。还有这个unofficial summary of the situation。加上个人经验:每次在 GAS 的 JS 实现中遇到 bug,我都能在 Rhino tracker 中找到那个 bug。
    • 寻找 Rhino 和 AppEngine 也会得到一些细节,例如。 stackoverflow.com/questions/2658831/…
    • 是的,但 Google App Engine 是与 Google Apps Script 完全不同的产品。
    【解决方案2】:

    Apps Script 似乎在 Rhino 1.7r3 上运行。以下是关于支持和不支持的内容。

    http://ramblings.mcpher.com/Home/excelquirks/gassnips/rhinoversion

    【讨论】:

      【解决方案3】:

      虽然 Appscript 本身仍然远远落后于 ES 时代,但使用 Google 维护的 Clasp 工具确实可以让您现在以官方支持的方式使用 Typescript 开发应用程序脚本,这将让您可以使用 Set() 和所有其他语言功能。

      https://github.com/google/clasp/blob/master/docs/typescript.md

      请注意这里的大限制,一旦您转向使用 Typescript,您将无法再在应用脚本脚本编辑器中开发/调试您的代码,因为您将查看转译的代码。

      同样,也有非谷歌项目使用 webpack 和 babel 从 ESx 转换为 appscript 代码。

      例如https://github.com/labnol/apps-script-starter

      【讨论】:

        【解决方案4】:

        来自 AppScript 运行时概览https://developers.google.com/apps-script/guides/v8-runtime的一些新闻

        从历史上看,Apps Script 一直由 Mozilla 的 Rhino JavaScript 解释器提供支持。虽然 Rhino 为 Apps Script 提供了一种方便的方式来执行开发者脚本,但它也将 Apps Script 绑定到特定的 JavaScript 版本(ES5)。 Apps 脚本开发人员无法在使用 Rhino 运行时的脚本中使用更现代的 JavaScript 语法和功能。

        为了解决这个问题,Apps 脚本现在得到了支持 Chrome 和 Node.js 的 V8 runtime 的支持。您可以将现有脚本迁移到 V8 以利用现代 JavaScript 语法和功能。

        【讨论】:

          【解决方案5】:

          这是一个用于 Apps Script 的 ES6 shim,因此您可以使用 Set 和 Map 之类的东西。 IDE 当然不支持箭头函数或任何其他可能破坏 5.1 语法的东西。

          http://ramblings.mcpher.com/Home/excelquirks/gassnips/es6shim

          【讨论】:

            【解决方案6】:

            尝试使用此代码:

            function test() {
            let search_from_data = ['a', 'b', 'c', 1, 2];
            let search_data = ['c', 'a', 'd', 'z', 2, 3, 4, 5];
            let search_set = new Set();
            for ( let i = 0 ; i < search_from_data.length ; i++ )
                search_set.add(search_from_data[i]);
            for ( let i = 0 ; i < search_data.length ; i++)
                Logger.log([search_data[i], "Is present?", search_set.has(search_data[i])]);
            }
            

            This Image is the output for the above code

            【讨论】:

            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 2018-09-26
            • 1970-01-01
            • 1970-01-01
            • 2014-12-06
            • 1970-01-01
            • 2017-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多