【问题标题】:Using UrlFetchApp in a container-bound script to run code in a web app as effective user在容器绑定脚本中使用 UrlFetchApp 以有效用户身份在 Web 应用程序中运行代码
【发布时间】:2016-02-17 21:21:40
【问题描述】:

有点过头了。尝试使用容器绑定脚本中的 UrlFetchApp.fetch(url, options) 在 Web 应用程序中运行代码。

问题:容器绑定的文档脚本只能作为activeUser运行。 doc 脚本通过复制模板来创建新文档。我希望从模板新创建的文档存储在开发人员拥有的集中文件夹中。我看到了两种解决方案。

  1. 我授予所有域用户对开发人员文件夹的查看/编辑权限。
  2. 我从一个独立脚本创建了一个 Web 应用程序,该脚本作为有权访问该文件夹的有效用户(开发人员)运行。在这种情况下,文档脚本使用 UrlFetchApp 调用 Web 应用程序,并传入参数(文件夹、文档)。但是,如果可能的话,非常能够弄清楚如何做到这一点。

    var unitId =  DocumentApp.getActiveDocument().getId();
    var unit = DriveApp.getFileById(unitId);
    var folderId = unit.getDescription() //FoldId for unit is stored in description
    var folder = DriveApp.getFolderById(folderId);
    var lesson = DriveApp.getFileById(UNIT.LESSON_TEMPLATE_ID).makeCopy('Lesson - ' + result.getResponseText());
    folder.addFile(lesson);//Currently I have the folder shared/edit with domain users.
                          //I would prefer to share/view. However, since the 
                          //container-bound doc script runs only as active user, no 
                          //can do.  Is it possible to build a small web app which 
                          //runs as effective user and saves lesson to folder. 
    
    showLessonSidebar(folderId);
    

    有什么提示吗?

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    是的,可以创建一个以有效用户身份运行的 Web 应用程序。如果开发人员 - 有效用户有权访问文件夹和模板文件。

    您可以将要复制的文件的 folderId 和 Name 传递给 WebApp,而不是传递文件夹和 Doc 对象(将文件夹对象和 Doc 对象作为 URL 参数传递可能非常棘手,如果内容太大可能不会甚至可能,因为 URL 的可能长度有限制)

    1) 编写 Apps 脚本

      function doGet(e) {
         var folderId = e.parameters.folderId;
         var copyFileName = e.parameters.name;
         var userEmail = e.parameters.email;
         var folder = DriveApp.getFolderById(folderId);
         var lesson = DriveApp.getFileById(UNIT.LESSON_TEMPLATE_ID).makeCopy(copyFileName);
         folder.addFile(lesson);
         //share file to domain or share folder with domain - folder.setSharing(....);
         file.setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.VIEW);
      }
    

    2) 部署Web App时,开发者可以将Execute设置为me(developer@...),将“Who has access to Web App”设置为Anyone。

    3) 确保开发者已授权网络应用。

    4) 与所有域用户共享 Web 应用脚本文件。

    另外,如果您出于某种原因想要将文件内容从容器脚本传递到 Web 应用程序,您可以考虑在 doPost() 中实现逻辑,因为您可以在 UrlFetch 中使用 POST 传递大数据。

    【讨论】:

    • 谢谢你。我在构建 UrlFetchApp.fetch(url, options) 调用时也遇到了问题。您对如何构建有任何提示吗?
    • 如何部署您的 Web 应用程序(您从 UrlFetchApp 调用的那个) - 始终以调用它的用户或开发人员的身份运行?其次,您在使用 UrlFetchApp 时遇到了什么错误?
    • 我希望将 Web 应用程序部署为开发人员(有效用户)。我想从容器绑定的文档脚本中调用它,并将文件夹 ID 和文件名传递给它。我无法构造 UrlFetchApp.fetch(url,options) 调用。这对我来说有点太复杂了。我希望有人能给我看一个例子,也许我可以逆向工程来理解。
    • 您没有阅读Docs 中的示例并浏览高级参数列表吗?另见example
    • 我做到了。这只是在我头上一点点。
    【解决方案2】:

    据我了解,在绑定脚本中使用UrlFetch 的唯一方法是使用installed trigger。 (UrlFetch 在绑定脚本的simple triggers 中使用时无权运行:https://developers.google.com/apps-script/add-ons/lifecycle#authorization_modes。)
    已安装的触发器始终“在创建触发器的用户的授权下运行,即使另一个具有编辑权限的用户打开电子表格也是如此”。因此,只需使用installed triggers

    function setupTrigger(){
      var doc = DocumentApp.getActiveDocument();
      ScriptApp.newTrigger('open').forDocument(doc).onOpen().create();
    }
    

    此示例代码创建一个可安装的触发器,用于打开绑定到脚本的文档。

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多