У меня есть Google Sheet для отслеживания проектов, которыми я хотел бы поделиться с другими людьми в моей компании. Я разработал пользовательский интерфейс с использованием html-форм, которые помогают пользователю задавать вопросы, чтобы получить необходимые данные для расчета стоимости проекта.
Формы открываются с помощью пользовательского меню - и это прекрасно работает как для меня, так и для других пользователей (в данном случае на самом деле я использую другую учетную запись Google).
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('PROJECT COSTING TOOL')
.addItem('Create a New Proposal', 'newProposal')
.addItem('Create a New Version of this Proposal', 'copyProposal')
.addSubMenu(SpreadsheetApp.getUi().createMenu('Edit This Proposal')
.addItem('Edit Project Background', 'editBackground')
.addItem('Edit Project Complexity', 'editProject')
.addItem('Edit Category Complexity', 'editCategory'))
.addToUi();
}
Например, выбор «Редактировать сложность проекта» запускает функцию editProject в приложении Script. «Редактировать сложность категории» запускает функцию editCategory. Оба отлично работают для любого пользователя.
Эти функции открывают HTML-формы, используя openForm:
function editProject(curProp) {
console.log('Opening editProject for Project #' + curProp);
curProp = curProp || SpreadsheetApp.getActiveSpreadsheet().getRangeByName('CurrentProposal').getValue();
console.info('curProp is now ' + curProp);
var projRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('Data_Projects');
openForm('frmProject', 'Edit Project Complexity',700,800,rowToJson(projRange,findRow(projRange,curProp)));
}
Вы можете увидеть, как код проверяет, передан ли # проект через e, и если нет, он просматривает его в самом Листе. В каждой html-форме есть кнопки, которые сохраняют изменения в Sheet, закрывают форму и открывают другую форму (Next или Prev). Вот где у меня проблемы. Как для себя, так и для пользователей, не являющихся владельцами, функция сохранения и закрытия работает отлично. И когда я запускаю функцию editProject, она тоже работает нормально. Но это никогда не делает его openForm.
function saveCategoryPrev(e) {
console.log('SaveCategoryPrev has been run: ' + e);
var projID = saveCategory(e);
console.info('saveCat is done. Back to sCP with Project #' + projID)
editProject(projID);
}
Работая как я (владелец), он прекрасно работает. Запуск от имени другого пользователя, все делает до openForm и завершает работу без ошибок. Вот журнал из этого случая:
D SaveCategoryPrev has been run: [[7,<other data>]] for proj [undefined
D SaveCategory has been run: [[7,<other data>]]
D project is 7
D Data Array = <some data>
D saveCategory: 537ms
I saveCat is done. Back to sCP with Project #7
D Opening editProject for Project #undefined
I curProp is now 7
Когда я запускаю его как себя, вы можете видеть, что следующий шаг вызван:
D SaveCategoryPrev has been run: [[7,<other data>]] for proj [undefined]
D SaveCategory has been run: [[7,<other data>]]
D project is 7
D Data Array = <some data>
D saveCategory: 370ms
I saveCat is done. Back to sCP with Project #7
D Opening editProject for Project #7
I curProp is now 7
D onLoad = {"Proposal ID":7,"Opportunity ID":"","Ver #":1,"Project Start":"2019-05-01T04:00:00.000Z","Duration (mo)":2,"Sales Engineer":"...}
OpenForm:
function openForm(formName, formTitle, fmHeight, fmWidth, paramData) {
fmHeight = fmHeight || "450";
fmWidth = fmWidth || "800";
var html = HtmlService.createHtmlOutputFromFile(formName).setHeight(parseInt(fmHeight)).setWidth(parseInt(fmWidth));
if (paramData) {html.append("<div id='gsParam' style='display:none;'>" + paramData + "</div>");}
SpreadsheetApp.getUi().showModalDialog(html, formTitle);
}
Что мне не хватает? Какая разница между мной и другим пользователем, который принял авторизацию? В чем разница между открытием формы с помощью меню и открытием ее с помощью кода?