我有一份表格,我希望我的员工每天都能完成。为此,我在电子表格中添加了一个脚本,以自动通过电子邮件将表单链接发送给与电子表格共享的所有人。还有一封每周发送回电子邮件的电子邮件。我已将所有共享用户存储在ScriptDb中。我想做的是编写一个允许设置用户首选项的UiApp,以便可以禁用每日/每周电子邮件。我还希望能够在这里添加没有与他们共享的工作表的新用户(对于那些只有链接的人)。我的整个公司使用谷歌,所以我不必担心有人没有登录或访问。
首先,我尝试创建一个简单的UiApp表单,该表单只显示现有共享用户的电子邮件首选项复选框。我的doPost从未被调用,我仍然不确定为什么。但是,我真正想要的是一个看起来就像共享设置屏幕的屏幕,而不是编辑/视图访问,我会有用户首选项。将用户添加到我的自定义版本的屏幕不会将其添加为协作者或查看者。
有关如何使用UiApp重新创建共享屏幕的任何想法?
如果那是不可能的,那么在我当前的简单首选项屏幕中我做错了什么?
function editUserPreferences() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
updateUserPreferences();
var db = ScriptDb.getMyDb();
var results = db.query({});
var saveUserRow = [];
//define form
var app = UiApp.createApplication().setTitle("Edit User's Email Preferences");
app.setHeight(550).setWidth(800);
var form = app.createFormPanel().setId('frm');
var formContent = app.createGrid(results.getSize()+5,3);
formContent.setWidget(0, 0, app.createLabel('Email Address'));
formContent.setWidget(0, 1, app.createLabel('Receive Daily'));
formContent.setWidget(0, 2, app.createLabel('Receive Weekly'));
formContent.setWidget(1, 1, app.createLabel('Reminder'));
formContent.setWidget(1, 2, app.createLabel('Entries'));
var row = 2;
while (results.hasNext()) {
var obj = results.next();
row = row+1;
formContent.setWidget(row, 0, app.createTextBox().setValue(obj.email).setReadOnly(true));
formContent.setWidget(row, 1, app.createCheckBox().setValue(obj.preferences.dailyEmail).setName('daily' + row));
formContent.setWidget(row, 2, app.createCheckBox().setValue(obj.preferences.weeklyEmail).setName('weekly' + row));
obj.row = row;
saveUserRow.push(obj);
}
// file changes
var results = db.saveBatch(saveUserRow, false);
if (db.allOk(results)) {
// everything went swimmingly, proceed
}
else { // partial or no success
for (var i = 0 ; i < results.length; i++) {
var item = results[i];
if ((typeof item.success) == 'function' && !item.success()) {
MailApp.sendEmail(Session.getActiveUser().getEmail(), "Error Updating Script Database", Logger.getLog());
}
}
}
row = row + 2;
formContent.setWidget(row, 1, app.createSubmitButton('Submit'));
form.add(formContent);
app.add(form);
ss.show(app);
}
function doPost(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var app = UiApp.getActiveApplication();
var db = ScriptDb.getMyDb();
var results = db.query({});
var editedUserData = [];
Logger.log("in doPost");
while (results.hasNext()) {
var obj = results.next();
var dailyParam = "daily" + obj.row;
var weeklyParam = "weekly" + obj.row;
Logger.log("test");
Logger.log(obj.email);
Logger.log(dailyParam);
Logger.log(weeklyParam);
obj.preferences.dailyEmail = e.parameter.dailyParam;
obj.preferences.weeklyEmail = e.parameter.weeklyParam;
Logger.log(Utilities.jsonStringify(obj));
editedUserData.push(obj);
}
app.close();
return app;
}
doPost中没有记录任何内容,执行事务中的最后一个条目是:
FormPanel.getId()
FormPanel.getId()
UiInstance.isStandardsMode()
答案 0 :(得分:0)
Kmt - 无法以编程方式控制“共享”屏幕。你必须像在这里一样重建它。
关于doPost的问题 - 我认为它有效。我认为有一个记录器问题,在doPost中生成日志(异步不工作)。尝试创建一个文件或附加到doPost中的电子表格,这将起作用。