1

我有一个表格,我希望我的员工每天填写。为此,我在电子表格中添加了一个脚本,以自动通过电子邮件将表单链接发送给与电子表格共享的每个人。每周还会有一封电子邮件回复他们的回复。我已将所有共享用户存储在 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()
4

1 回答 1

0

Kmt - 无法以编程方式控制共享屏幕。你必须像在这里一样重建它。

关于您与 doPost 的问题 - 我认为它有效。我认为在 doPost 中生成的日志存在记录器问题(异步不起作用)。尝试在 doPost 中创建文件或附加到电子表格中,这将起作用。

于 2012-11-01T18:44:25.917 回答