在容器绑定脚本中使用UrlFetchApp以在有效用户的Web应用程序中运行代码

时间:2013-07-07 15:10:23

标签: google-apps-script

略微超过我的脑袋。尝试使用容器绑定脚本中的UrlFetchApp.fetch(url,options)在Web应用程序中运行代码。

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

  1. 我让所有域用户查看/编辑对开发人员文件夹的访问权限。
  2. 我从独立脚本创建一个Web应用程序,该脚本作为有权访问该文件夹的effectiveUser(开发人员)运行。在这种情况下,doc脚本使用UrlFetchApp传入参数(文件夹,doc)来调用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);
    

    有任何提示吗?

2 个答案:

答案 0 :(得分:0)

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

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

1)编写应用程序脚本

  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设置为我(developer @ ...)并将“谁有权访问Web App”设置为任何人。

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

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

此外,如果您因某种原因要将文件内容从容器脚本传递到Web App,您可以考虑在doPost()中实现逻辑,就像在UrlFetch中使用POST传递大数据一样。

答案 1 :(得分:0)

据我了解,在绑定脚本中使用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();
}

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