在Google App Script中使用导入的模块

时间:2018-03-10 01:49:23

标签: javascript algorithm google-apps-script

我正在尝试在Google App Script中使用string similarity,但我并不完全清楚如何让它在App Script中运行,我会遇到多个错误,例如"要求"没有定义,作为另一个注释,模块本身似乎具有依赖性。

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

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]);   }    }

3 个答案:

答案 0 :(得分:8)

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

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

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

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

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

P.S。在GAS中,所有&#34; .gs&#34;文件共享相同的命名空间,因此调用&#39;要求&#39;功能是多余的。如果你想模仿这种行为,你仍然需要编写自己的需求函数。

答案 1 :(得分:1)

默认情况下,

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

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

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

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

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

答案 2 :(得分:1)

我编写了一些关于打包 npm 模块以在 this article 中的 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

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

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