我有一个 Apps 脚本应用程序,它为两个 HTML 界面之一提供服务,并具有许多后端功能。我不知道如何使用某种全局变量/切换来更改服务器端函数的行为。
这就是我向用户提供页面的方式,一些用户获得带有附加设置的管理页面(例如关闭松弛通知)
function doGet() {
// This built-in function will check group membership for us and returns a single object with an isMember bool
if (AdminDirectory.Members.hasMember(ADMIN_USERS_GROUP, Session.getActiveUser().getEmail()).isMember) {
return HtmlService.createTemplateFromFile("admin").evaluate();
}
else if (AdminDirectory.Members.hasMember(ALLOWED_USERS_GROUP, Session.getActiveUser().getEmail()).isMember) {
return HtmlService.createTemplateFromFile("index").evaluate();
}
else { return HtmlService.createTemplateFromFile("noaccess").evaluate(); }
}
用户登录Web界面并以HTML表单输入数据以运行后端功能。通常,这些函数会调用一个发布到 Slack 的函数来记录其操作:
/**
* Add a filter and label to a user's account to filter mail from another user to the label, skipping the inbox
* @param {Object} formObject - form object from frontend
*/
function frontend_modifyForwardingDelegation(formObject) {
...
modifyGmailACLs(raw_sourceUser, raw_targetUser, option, action);
}
/**
* Modify Gmail acls for an account
* @param {string} sourceUser - email or username of user to modify
* @param {string} targetUser - email or username of user to create a relationship with
* @param {string} option - forward or delegate
* @param {string} action - create or delete
*/
function modifyGmailACLs(raw_sourceUser, raw_targetUser, option, action) {
// code
sendSlackString(message);
}
// in another file
function sendSlackString(slackBody) {
if (SLACK_POST=='enabled') {
var template = {
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": `${slackBody}`
}
}
]
}
sendSlackMessage(template);//this actually makes the api call
} else {
console.info(`Slack posting disabled for message\n\n${slackBody}`);
}
}
// this is in the frontend JS. It's connected to a radio button toggle HTML form. only users on the admin.html page see this option
function toggleSlackMessages(form) {
google.script.run.withFailureHandler(showFail).withSuccessHandler(toggleSlackSuccess).frontend_toggleSlack(form);
}
属性服务中的
setProperties
功能看起来很接近,因为它只能为一个用户工作,但我在测试中意识到服务器功能始终以同一用户身份运行,所以这是行不通的。服务器端 sendSlackString 服务器函数需要根据客户端的登录用户以及他们在 Web UI 中执行的操作进行更改。
有没有一种干净的方法来设置与应用程序脚本中的用户绑定的变量?
恐怕你还没有提到你是如何部署你的Web应用程序以及你使用了哪些属性存储。
首先调整您的 Web 应用程序以使用 PropertiesService.getUserProperties() 获取 PropertiesService.Properties 对象,然后部署您的 Web 应用程序以访问 Web 而不是“我”的用户身份运行。