【问题标题】:Script to automatically make a copy of a Google Document for editing用于自动制作 Google 文档副本以供编辑的脚本
【发布时间】:2012-10-24 16:30:10
【问题描述】:

我觉得在这里发帖完全是个菜鸟。我非常了解 CSS、HTML 和 XML,但一直避免使用 JS。我对 javascript 知之甚少,最近开始了 Lynda.com 课程来赶上。对不起我的无知。因此,我真的很难学习 Google Apps 脚本。显然,我需要先学习 JS,然后才能理解其中的任何内容。

我工作的学校(5000 名学生)设置了在线课程。我以数千个谷歌文档工作表的形式创建了课程。这些工作表链接在各种网站上。

我们面临的问题是,当学生打开文档时,他们必须先复制它们才能编辑它们(我当然不希望他们能够编辑原件)。这对于在平板电脑上使用移动浏览器的学生来说真的很糟糕,因为在移动设备上使用桌面 UI 时,在 Google Docs 中制作副本并不能很好地工作。

我知道这种事情可以通过脚本自动化。我看过here,低头看,它有效!三年来我一直在寻找这样的功能,我高兴得尿了裤子。 (是的,我知道这很可悲)。

所以,我要问的是,有没有人愿意帮助菜鸟弄清楚如何调整这段代码,以便学生点击网站课程上的按钮,它会自动制作并打开一份新标签中的工作表?

/**
 * Copy an existing file.
 *
 * @param {String} originFileId ID of the origin file to copy.
 * @param {String} copyTitle Title of the copy.
 */
function copyFile(originFileId, copyTitle) {
  var body = {'title': copyTitle};
  var request = gapi.client.drive.files.copy({
    'fileId': originFileId,
    'resource': body
  });
  request.execute(function(resp) {
    console.log('Copy ID: ' + resp.id);
  });
} 

昨天花了一整天的时间学习 Javascript,我还有很长的路要走。不知道我需要多长时间才能自己解决这个问题。

【问题讨论】:

  • 你的问题到底是什么?
  • 基本上,需要通过单击按钮执行此功能并让文档在新选项卡中打开。寻找足够友善的人来修改代码。
  • 这不是 Apps 脚本代码。您是否尝试过学习它? (在请人为你写之前)
  • 对,正在学习js。只是想我会问,因为修改代码可能需要十秒钟。我知道我需要学习这些东西。
  • Apps Script 基本上只使用 javascript 语法,其他一切都不同(可能有少数例外)。因此,学习一个并不能真正帮助学习另一个。好吧,至少不比学习编程更多。

标签: google-apps-script google-drive-api google-docs google-docs-api


【解决方案1】:

您当然可以使用 Apps 脚本来做到这一点。只需要几行。事实上,你可以只使用我在下面写的版本。

这是我的做法 -

  1. 确保您的原始文档至少已为将要访问它的人启用。

  2. 从 URL 中获取 fileId -

  3. 使用以下代码在 Apps 脚本中编写 web app -

    function doGet(e) {
      //file has to be at least readable by the person running the script
      var fileId = e.parameters.fileId;  
      if(!fileId){
        //have a default fileId for testing. 
        fileId = '1K7OA1lnzphJRuJ7ZjCfLu83MSwOXoEKWY6BuqYitTQQ'; 
      }
      var newUrl = DocsList.getFileById(fileId).makeCopy('File copied to my drive').getUrl(); 
      return HtmlService.createHtmlOutput('<h1><a href="'+newUrl+'">Open Document</a></h1>');
    }
    
  4. 部署它以作为访问应用程序的人运行。

要记住的关键一点是,由 Apps 脚本构建的网络应用程序不能强制自动打开一个新窗口。相反,我们可以在编辑模式下显示一个可点击进入文档的链接。

您可以在这里看到它的实际效果(将创建一些虚拟文件) -

https://script.google.com/macros/s/AKfycbyvxkYqgPQEb3ICieywqWrQ2-2KWb-V0MghR2xayQyExFgVT2h3/exec?fileId=0AkJNj_IM2wiPdGhsNEJzZ2RtZU9NaHc4QXdvbHhSM0E

您可以通过输入自己的fileId 来测试它。

【讨论】:

  • 据我了解,这要求文件共享设置保持为“知道链接的任何人”,对吧?
  • 注意:如果您授予上述链接访问权限,则它有权添加、更新和删除您云端硬盘中的所有文件
【解决方案2】:

自 2015 年起更新,Google Script removed the fileId,原因不明。之前将“/copy”附加到 Google 文档的 URL 的方法已重新启用。例如)https://docs.google.com/document/d/1GTGuLqahAKS3ptjrfLSYCjKz4FBecv4dITPuKfdnrmY/copy

【讨论】:

    【解决方案3】:

    由于 DocsList 已被弃用,目前您可以使用以下代码复制文件:

    File file=DriveApp.getFileById(fileId).makeCopy(fileName, folder);
    

    fileId 可以按照 Arun Nagarajan 在answer 中的说明获得。

    【讨论】:

    • 这不起作用。我转到脚本编辑器,复制粘贴您的代码,用单引号中的唯一文件标识符替换 fileId,但我收到错误消息 SyntaxError: Unexpected identifier (line 1, file "Code.gs")
    • 这行代码对我有用,谢谢!对于上面的注释,你不仅要改变“fileId”,还要改变“fileName”和“folder”。换句话说,您必须更改三个参数:fileId、fileName、文件夹。虽然 .getFileById 需要文件 ID,但 .makeCopy() 是可选的;将两者都留空,它将采用默认值;将一个留空,它将仅假定该值的默认值;或同时提供文件名和文件夹的值以进行最终控制。
    【解决方案4】:

    这是正确执行此操作的代码(适用于 2019、2020、2021):

    /**
     * Create custom menu when document is opened.
     */
    function onOpen() {
      DocumentApp.getUi()
        .createMenu('For Students')
        .addItem('Make a copy', 'makeACopy')
        .addToUi();
    }
    
    function makeACopy() {
      var templateId = DocumentApp.getActiveDocument().getId();
      DriveApp.getFileById(templateId).makeCopy();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多