我最近迷上了谷歌网络应用程序,但我遇到了一些进退两难的问题。我正在尝试构建一个对非常特定的用户开放的应用程序,并且他们正在查看的数据根据其访问组进行过滤。
在谷歌表格中,我列出了用户电子邮件及其各自的访问组。A 列 - 电子邮件,B 列 - 访问组
问题
当用户访问网络应用程序时,我使用它来获取他们的电子邮件:
var email = Session.getActiveUser().getEmail();
Run Code Online (Sandbox Code Playgroud)
然后我运行此代码来获取他们的访问组:
function validate(email){
var sheet = SpreadsheetApp.openById(ID).getSheetByName(ssUserList);
try{
var group = getRowsData(sheet).find(e => e.userEmail === email).securityGroup;
return group;
} catch(e){
return "Not Authorized";
}
}
Run Code Online (Sandbox Code Playgroud)
由于用户无权访问我的谷歌工作表,因此在函数运行时他们会收到错误。而且我无法部署 Web 应用程序以我的身份运行,因为我需要用户的电子邮件。我很明白这一点。
我读过的内容:
关于访问令牌和凭据以及 urlFetchApps 的大量其他帖子和文章......我不理解其中任何一个,说实话,我不知道哪一个对我的情况更有意义。
我尝试过的:
我无法使用我发现的第一个可用选项,即访问Web 应用程序 1(以用户身份运行),然后使用用户电子邮件作为参数调用 Web 应用程序 2,因为如果他们共享来自 Web 应用程序 2 的链接,则任何人都可以看到这些数据,而我正在处理非常敏感的数据。
我意识到我可以将这些参数放在单独的工作表中,并给予它们仅查看访问权限,并且脚本将运行良好,但我是额外的,我想做得正确。
实际上,我还有一些其他功能需要以我的身份运行。如果你处于我的处境,你会从哪里开始?或者有人可以通俗地解释一下吗?我应该研究这样的事情吗?任何帮助表示赞赏!
我有一个函数可以复制现有文档(模板),然后通过将标题名称与文档中列出的标签进行匹配来动态合并数据。该函数运行没有任何问题,但现在每当它尝试合并时突然我都会收到一条错误消息。任何人都可以让我深入了解问题可能是什么?
错误消息:异常:无效参数:替换
奇怪的是,它并没有阻止信息合并,但错误确实阻止了函数完成其他任务。
与错误一致
headers.forEach(function(e){
body.replaceText("<<"+e+">>",data[e]);
return;
});
Run Code Online (Sandbox Code Playgroud)
整个代码:
function documents(sheet, data){
var headers = Object.keys(data[0]);
var docsToMerge = data.map(function(e){
var name = e.location +" - "+e.employeeLastName+", "+e.employeeFirstName+" - "+e.docName+" "+Utilities.formatDate(new Date(e.effectivePayDate), "UTC-4", "M/d/yy");
var newDoc = DriveApp.getFileById(e.template).makeCopy(name, DriveApp.getFolderById(e.folderId));
e.documentLink = newDoc.getUrl();
e.documentId = newDoc.getId();
return e;
});
docsToMerge.forEach(function(e){
mergeDocuments(e, headers, signatureFolderId);
});
}
function mergeDocuments(data, headers){
var id = DocumentApp.openByUrl(data.documentLink).getId();
var doc = DocumentApp.openById(id);
var body = doc.getBody();
headers.forEach(function(e){
body.replaceText("<<"+e+">>",data[e]);
return;
});
doc.saveAndClose();
return;
}
Run Code Online (Sandbox Code Playgroud)