Folders.hasNext () возвращает false из Google Sheets, но true при вызове напрямую из Google Script - PullRequest
0 голосов
/ 13 апреля 2019

Обзор

Я делаю скрипт для своего листа Google.

У меня есть вспомогательный метод, который принимает электронную почту для параметра (строки), а затем приглашает ее отправитьпапка гугл дисководов.

У меня также есть функция edit (), которая вызывается при каждом изменении поля в Google Sheets.


Проблема:

Когда вспомогательный метод вызывается сам по себе из Google Scripts, он работает нормально, и я получаю приглашение.Когда вспомогательный метод вызывается из edit (), когда я нахожусь в листах Google, он не проходит весь путь, чтобы отправить приглашение.Она останавливается на функции while, которая возвращает false:

 var newFolder = DriveApp.getFoldersByName("New Folder");
  Logger.log(newFolder.hasNext());
  while(newFolder.hasNext()) {      -> returns false while in google sheets
    var folder = newFolder.next();
    Logger.log("folder -> " + folder);  
    folder.addViewer(newPersonEmail);
  } 

То, что я пробовал:

Logger.log показывает, что newFolder.hasNext() возвращает false, когда скрипт получаетвызывается из edit() функции (когда я делаю изменения в гугл листах).Но он возвращает true, когда я просто отлаживаю функцию в скриптах Google.

1 Ответ

1 голос
/ 13 апреля 2019

Вы должны зарегистрироваться edit() для конкретного пользователя. Это невозможно для простого триггера onEdit.

Возвращает false, потому что для текущего пользователя ничего нет. И это правда.

===== Обновлено =====

Что касается меня, я думаю, что нормально создавать триггеры для пользователей каждый раз, когда нам нужны их области действия. Предположим, нам нужно заставить пользователя зарегистрировать триггер. Он должен бежать regTrigger()

/**
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e
 */
function edit(e) {
  // there is the edit eveng action
}

/**
 * Register trigger
 * @returns {GoogleAppsScript.Script.Trigger}
 */
function regTrigger() {
  var activeSpreadsheet = SpreadsheetApp.getActive();
  var triggers = ScriptApp.getUserTriggers(activeSpreadsheet).filter(function(
    trigger
  ) {
    return (
      trigger.getEventType() === ScriptApp.EventType.ON_EDIT &&
      trigger.getHandlerFunction() === 'edit'
    );
  });

  if (triggers.length) return triggers[0];

  return ScriptApp.newTrigger('edit')
    .forSpreadsheet(activeSpreadsheet)
    .onEdit()
    .create();
}

Теперь ваша задача - дать пользователю возможность выполнить эту функцию один раз (regTrigger). Например, из меню. Или сделать это, когда вы откроете таблицу, форсируя некоторые события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...