【问题标题】:Using an imported module inside Google App Script在 Google App Script 中使用导入的模块
【发布时间】:2018-08-18 15:53:12
【问题描述】:

我正在尝试在 Google App Script 中使用 string similarity,但是我并不完全清楚如何让它在 App Script 中运行,我收到多个错误,例如“require”未定义,作为另一个注释,模块本身似乎有依赖关系。

我的最终目标是使用此脚本将一个包含拼写错误的字符串的数组与一个包含正确字符串的数组之间的字符串分数匹配在 App 脚本中。这是我失败的代码。

function matchEmails() {   var doc =
 SpreadsheetApp.openById(("ID"));

   var ts = doc.getSheetByName("dir");   var source =
 doc.getSheetByName("data");   var names =
 source.getDataRange().getValues();   var data =
 ts.getDataRange().getValues();   var arr = [];   var arr2 = [];   var
 arr3 = [];   var arr4 = [];
      for (i=0; i<names.length; i++) {

     for (j=0; j<data.length; j++) {

           stringSimilarity.compareTwoStrings(names[i][0], data[j][0]);   Logger.log(stringSimilarity);




       /*
       var n = data[j][0].split();
       for (N=0; N<n.length; N++) {
       arr2.push(n[N].charAt(0));
       }
       var string2 = arr2.join("");
       var arr2 = [];

       if (names[i][0] === data[j][0]) {

       arr.push([data[j][1]]);

       }      */ //I want to replace this blanked out code with String >similarity.      

       if (string === string2) {

         arr.push([data[j][1]]);
         arr3.push([i+1]);
         arr4.push([data[j][0]]);


       }
     }   }   for (i = 0; i<arr.length; i++) {
     source.getRange(arr3[i],6).setValue(arr[i]);
     source.getRange(arr3[i],7).setValue(arr4[i]);   }    }

【问题讨论】:

    标签: javascript algorithm google-apps-script


    【解决方案1】:

    您的 GAS 项目不是 Node.js 应用程序,因此上述方法不起作用。虽然 Google Apps Script 和 Node 都使用 JavaScript,但它们为执行 JS 代码提供了不同的运行时环境。在 GAS 中,环境是 Google 服务器上的一个封闭生态系统,最终用户对此一无所知。

    在 Node 中,运行时由 V8(JS 引擎)和暴露低级 API(访问文件系统等)的 C++ 插件组成。您引用的库是为 Node.js 创建的 NPM 包。通过 NPM 安装包将使其可用于 Node 项目,但不要认为它也会神奇地出现在 Google 服务器上。

    您必须使用这些依赖项的 GAS 特定版本,或者,如果它们不存在,则重构源代码以使其与 GAS 兼容(Node 和 GAS 使用不同的 ECMAScript 版本,因此箭头函数等一些最新功能会破坏你的 GAS 代码)。

    例如,这里是 GAS 的 lodash https://github.com/contributorpw/lodashgs

    在 GAS 中使用库 https://developers.google.com/apps-script/guides/libraries

    附:在 GAS 中,所有“.gs”文件共享同一个命名空间,因此调用 'require' 函数是多余的。如果你想模仿这种行为,你仍然需要编写自己的 require 函数。

    【讨论】:

    • 谢谢安东,我现在更清楚了。我已经放弃尝试重构代码,是时候继续前进了。
    【解决方案2】:

    默认情况下,Google Apps 脚本文件可以访问 Google API,例如 G Suite 服务中的电子表格服务: https://developers.google.com/apps-script/reference/spreadsheet/

    默认情况下,GAS 项目(因此该项目中的脚本)无法访问 Node.js 或任何其他框架。但是,一个 GAS 项目可以通过引用作为库包含另一个 GAS 项目。在 GAS 脚本编辑器中,使用菜单 Resources > Libraries... 通过设置源项目的项目键(和一些其他源项目属性)来将外部 GAS 项目添加为库。

    因此,如果您有一个依赖于require 的外部资源(如 Node.js)的 Javascript,那么如果您可以找到一个使用相同 API 提供相同服务的外部 GAS 项目,您可以将其作为库提供给剧本。你省略了原始脚本中的 require 语句,因为它们被我提到的 GAS 库依赖配置替换了。

    如果您的原始脚本及其依赖项都是开源的,您可以为原始脚本中的每个级别的依赖项创建 GAS 项目。您已经可以找到一些流行的 JS 框架脚本,这些脚本可用作 GAS 库。

    GAS 还允许将外部资源打包为 Web 应用程序和其他包格式。它们可以与相应的技术一起使用,其中一些已经可以从其他开发人员那里获得。

    【讨论】:

      【解决方案3】:

      我在this article 中编写了一些关于打包npm 模块以供在Apps 脚本中使用的指南。

      tl;dr 是在一个新目录中创建一个index.js,并带有以下内容:

      import {compareTwoStrings, findBestMatch} from 'string-similarity';
      export {compareTwoStrings, findBestMatch};
      

      然后在该目录中运行以下命令:

      npm init -y
      npm install --save-dev string-similarity
      npx esbuild index.js --bundle --global-name=stringSimilarity --outfile=StringSimilarity.js
      

      然后,您可以将 StringSimiliarity.js 的内容复制到 Apps 脚本编辑器中的新 .gs 文件中。导出的函数将可以从您自己的Code.gs 使用,如stringSimilarity. compareTwoStrings() 和stringSimilarity.findBestMatch()。

      (如果您不想自己捆绑它,string-similarity 的esbuild 进程的输出可以在this gist 中找到。但一般步骤应该适用于大多数不'的npm 模块不需要 Node 或特定于浏览器的运行时环境。)

      【讨论】:

        【解决方案4】:

        根据 Jeff Posnick 的回答,请注意我们可以使用 https://esbuild.github.io 以同样简单的方式将完整的库引入 Google Apps 脚本。以 Ramda 为例:

        npm init -y
        npm install --save-dev ramda
        cp ./node_modules/ramda/dist/ramda.js .
        npx esbuild ramda.js --minify --bundle --global-name=R --outfile=R.js
        

        然后将 R.js 的内容复制到 Apps 脚本编辑器中的新 .g​​s 文件中。

        现在您可以在代码中使用 ramda,例如:

        const seventeen = R.add(7)(10);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-15
          • 2011-02-12
          • 2020-04-11
          • 1970-01-01
          • 1970-01-01
          • 2015-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多