【问题标题】:Transport Google Apps Script Project created for one sheet to another sheet将为一张工作表创建的 Google Apps 脚本项目传输到另一张工作表
【发布时间】:2021-06-07 19:32:57
【问题描述】:

我为一个 Google 表格创建了一个邮件合并程序。我点击了ToolsScript editor并创建了一个包含.gs.html文件的项目。

我有另一个结构相同但电子邮件和数据不同的 Google 表格。我想将 Google Apps 脚本项目从上一个工作表传输到新工作表。但是,我不确定如何执行此操作。

我尝试查看之前是否有人问过这个问题,但我找不到任何东西。我也不确定我是否误解了 Google Apps 脚本应该如何工作。

我已经在下面发布了代码

function sendEmail() {

  var first = 1;
  var email = 3;
  var link = 6; 

  var emailTemp = HtmlService.createTemplateFromFile('email_template');
  
  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  
  var data = ws.getRange("A2:I" + ws.getLastRow()).getValues();
  
  data.forEach(function(row){
        
      emailTemp.first = row[first]; 
      emailTemp.link = row[link]; 
      
      var htmlMessage = emailTemp.evaluate().getContent(); 

      GmailApp.sendEmail(
          row[email], 
          "Email Subject ", 
          "Your email doesn't support HTML.", 
          {name: "Organization", htmlBody: htmlMessage, replyTo:"email@gmail.com"
          }  )
          
  });
  
}


【问题讨论】:

  • 项目可以访问所有工作表。请发布您的代码
  • 您能否详细说明您为什么要这样做?正如 Cooper 所说,您可以从任何脚本访问任何电子表格。另外,为什么不直接将代码复制并粘贴到新项目中呢?可以说比为此编写函数要少。
  • 嗨,我已经添加了代码。我想我需要使用除 getActiveSpreadSheet() 之外的其他函数才能使用不同的 Google Sheet?我确实认为将代码复制并粘贴到与lamblichus建议的另一张表相关联的新项目中会很方便。我最初的想法是,可能有一种方法可以简单地将包括 HTML 模板在内的整个项目复制到与不同电子表格关联的另一个项目中。
  • 嗨,我发布了一个答案。让我知道这是否适合您。

标签: google-apps-script google-sheets


【解决方案1】:

“库是一个脚本项目,其功能可以在其他脚本中重复使用”

来自:

https://developers.google.com/apps-script/guides/libraries

首先,创建一个库。 在应用脚本项目中编写一些函数。 单击部署 => 新部署 对于部署类型,选择“库” 复制部署 URL

接下来在不同的项目中使用您的库: 在您的目标项目中,单击库旁边的加号 您必须输入图书馆 ID ID 在您之前复制的 url 中: https://script.google.com/macros/library/d//1 单击查找以查找库。如果你愿意,你可以重命名它。

要使用库: 键入库的名称,后跟一个点,然后是函数,就像任何其他服务一样。自动完成应该提供提示。

【讨论】:

    【解决方案2】:

    将不同名称的文件从一个项目附加到另一个项目:

    Gs:

    function appendSelectedFilesDialog() {
      SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('appendSelected1'), 'Append Selected Files');
    }
    
    function appendSelectedFilesIntoAnotherProject(obj) {
      const srcProjectId = obj.srcProjectId;
      const dstProjectId = obj.dstProjectId;
      const srcFileNames = obj.srcFileNames;
      var all = true;
      var fA = [];
      if (srcFileNames.length > 0) {
        all = false;
        fA = String(srcFileNames).split(',').map(n => n.trim());
      }
      if (srcProjectId && dstProjectId) {
        const base1 = "https://script.googleapis.com/v1/projects/"
        const url1 = base1 + srcProjectId + "/content";
        const url2 = base1 + dstProjectId + "/content";
        const options1 = { "method": "get", "muteHttpExceptions": true, "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() } };
        const res1 = UrlFetchApp.fetch(url1, options1);
        const data1 = JSON.parse(res1.getContentText());
        const srcfiles = data1.files;
        const options2 = { "method": "get", "muteHttpExceptions": true, "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() } };
        const res2 = UrlFetchApp.fetch(url2, options2);
        const data2 = JSON.parse(res2.getContentText());
        const dstFiles = data2.files;
        srcfiles.forEach(file => {
          if (file.source && file.name) {
            if (!all) {
              if (fA.indexOf(file.name) > -1) {
                dstFiles.push(file);
              }
            } else {
              dstFiles.push(file);
            }
          }
        });
        const request = { "files": dstFiles };
        const base = "https://script.googleapis.com/v1/projects/"
        const url = base + dstProjectId + "/content"
        const options = { "method": "put", "request": request, "muteHttpExceptions": true, "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "contentType": "application/json", "payload": JSON.stringify(request) };
        const resp = UrlFetchApp.fetch(url, options);
        console.log(resp);
        SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput('<textarea rols="12" cols="60">' + resp + '</textarea>'), "Update Script Project");
      }
      return { "message": "Process Complete" };//minimally to remove the dialog
    }
    

    html:

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
        <style>input{margin:2px 5px 2px 0;}</style>
      </head>
      <body>
        <form>
          <input type="text" id="src" name="srcProjectId" size="60" placeholder="Enter Source Project Id" />
          <br /><input type="text" id="dst" name="dstProjectId" size="60" placeholder="Enter Destination Project Id" />
          <br /><input type="text" id="names" name="srcFileNames" size="60" placeholder ="Enter Desired Files separated by commas or nothing if you want all files." />
          <br /><input type="button" value="Submit" onClick="process(this.parentNode);" />
        </form>
        <script>
          function process(obj) {
            google.script.run
            .withSuccessHandler(function(obj){google.script.host.close();})
            .appendSelectedFilesIntoAnotherProject(obj);
            console.log('Form:',JSON.stringify(obj));
          }
        </script>
      </body>
    </html>
    

    如果新项目有一个同名的文件,那么这个函数会失败。如果你愿意,你可以自己解决这个问题。我只是改变并继续前进。

    【讨论】:

      【解决方案3】:

      使用 openById / openByUrl:

      如果您想使用与脚本绑定的电子表格不同的电子表格,只需将getActiveSpreadsheet() 替换为openById(id)openByUrl(url),其中:

      所以我建议你替换这个:

      var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
      

      有了这个:

      var ws = SpreadsheetApp.openById("SPREADSHEET_ID").getSheetByName('Sheet1');
      

      或者这个:

      var ws = SpreadsheetApp.openByUrl("SPREADSHEET_URL").getSheetByName('Sheet1');
      

      使用 Apps Script API / 手动复制内容:

      此外,您可以使用 Apps Script API 到源脚本中的 get the contentupdate the target script with it,但我真的怀疑在您的情况下这样做是否值得,只要您不必复制大量脚本。

      手动复制脚本内容可能会减少工作量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        相关资源
        最近更新 更多