Google apps script 如何在谷歌电子表格中修改或复制共享屏幕

Google apps script 如何在谷歌电子表格中修改或复制共享屏幕,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个表格,我希望我的员工每天填写。为此,我在电子表格中添加了一个脚本,以自动通过电子邮件将表单链接发送给共享电子表格的所有人。每周也会有一封回复邮件。我已将所有共享用户存储在ScriptDb中。我想做的是编写一个UiApp,允许设置用户首选项,以便禁用每日/每周电子邮件。我还希望能够在这里添加没有共享工作表的新用户(对于那些只有链接的用户)。我的整个公司都使用谷歌,所以我不必担心有人没有登录或没有访问权限 起初,我尝试创建一个简单的UiApp表单,只显示现有共享用户的电子邮件首选项复选框。我

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

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


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

谢谢,我刚刚在电子表格中创建了另一张表格来控制用户的访问。谢谢
FormPanel.getId()
FormPanel.getId()
UiInstance.isStandardsMode()