如何以编程方式将脚本文件从一个谷歌工作表复制到另一个?

时间:2021-03-17 20:25:28

标签: google-apps-script

我为客户编写了一个应用程序,但大约有一百页需要完全相同的代码。 有没有捷径可以分别手动复制/粘贴代码到每张表的脚本编辑器中?

2 个答案:

答案 0 :(得分:0)

这是一个示例:

我怀疑它是防弹的,所以它可能需要一些额外的工作,但它似乎对我有用。

它会启动一个对话框,允许您输入源 ID 和目标 ID 以及要复制的文件。注意目的地不能有同名文件。

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>

答案 1 :(得分:0)

我肯定不会将代码复制到 100 个不同的电子表格中。我会创建(或使用您已经创建的脚本)as a library,您可以将其添加到您希望它运行的工作表中。这样,如果需要进行任何更改或完成错误测试,您就不必在 100 张纸上进行更改。

您还可以(应该?)考虑部署附加组件,因为如果工作表被复制、复制或共享,如果工作表的当前用户需要任何权限,它可能会造成严重破坏。将其设置为附加组件允许添加一次权限,而不是逐页添加。

如果您必须将脚本放在每张工作表上并且工作表被复制,请确保复制它们的人是脚本的所有者并且是有权运行库的人。

我有很多用户和数千个运行相同代码的电子表格,我创建了一个系统,该系统根据用户输入或是否将新文件添加到谷歌驱动器目录自动生成电子表格。这允许我(始终)拥有工作表,并且如果最终用户重新创建引用需要权限的代码或库的工作表,我不会遇到权限噩梦。

听起来好像我在权限问题上做得很大,但最大的问题是从 Google 表格方面来看,如果权限不存在,则根本不会显示任何错误代码 - - 它只是对最终用户不起作用,然后他们会感到沮丧,而您也会感到沮丧,并且您所做的任何更改都可能需要新的权限。相信我,权限问题需要对此进行调查。