略微超过我的脑袋。尝试使用容器绑定脚本中的UrlFetchApp.fetch(url,options)在Web应用程序中运行代码。
问题:容器绑定的doc脚本只能作为activeUser运行。 doc脚本通过复制模板来创建新文档。我希望从模板新创建的doc存储在开发人员拥有的集中文件夹中。我看到两种解决方案。
我从独立脚本创建一个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);
有任何提示吗?
答案 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();
}
此示例代码创建一个可安装的触发器,用于打开绑定到脚本的文档。