Сценарий Google Apps, запущенный другим пользователем на моем листе, не открывает форму - PullRequest
0 голосов
/ 04 мая 2019

У меня есть 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);
}

Что мне не хватает? Какая разница между мной и другим пользователем, который принял авторизацию? В чем разница между открытием формы с помощью меню и открытием ее с помощью кода?

...