Ранее работавший скрипт Google App теперь выдает ошибку разрешения

Я не могу найти ничего об обновлении политик Google в апреле 2022 года. Раньше этот скрипт работал без проблем, затем в середине дня необходимо было повторно добавить разрешения. Даже с указанными разрешениями Google по-прежнему говорит, что доступ запрещен. Позже было обнаружено, что макрос не выполнялся успешно с 31 марта.

  var newJobFile = DriveApp.getFileById(newJobID);
  newJobFile.AddEditors(['[email protected]','[email protected]');
  newJobFile.setOwner('[email protected]');

Последняя строка вызывает ошибку. При отладке я вижу, как создается переменная, но не вижу никакой информации о ней. Например, если я добавлю "Filecreated.getName();" до строки с ошибкой меню переменных остается пустым. Я не уверен, что это нормально. Подтверждено, что переменная "newid" имеет идентификатор электронной таблицы. Я могу скопировать его в URL-адрес, и он приведет меня на страницу. Почему это вдруг проблема и как я могу это исправить? Раньше у меня не было файла appscripts.json с OAuthScopes, и тогда он работал нормально. Я добавил его с соответствующими разрешениями, но это ничего не меняет. Я добавил несколько областей разрешений, чтобы попытаться решить эту проблему, но ни одна из них не работает. Любой совет?

"oauthScopes": [      
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets"
]

Обновлено: У меня все еще есть эта проблема. Даже когда все контролируется одной учетной записью, я не могу передать право собственности на «[email protected]» из-за «Исключение: доступ запрещен: DriveApp». Я нашел только одного человека, столкнувшегося с такой же проблемой на странице группы Google App Script. У кого-нибудь еще нет проблем с передачей права собственности, начиная с апреля, на обычном, нерабочем аккаунте?

Обновлено еще раз: Извините, что не загрузил свой код раньше, мне пришлось сначала его очистить.

function onOpen(e) {
  SpreadsheetApp.getUi()
    .createMenu('Add')    //creates toolbar entry to the right of 'Help'
      .addItem('Capital project','newProject')
      .addToUi();
}

function newProject(){
  var dashboard = SpreadsheetApp.getActiveSpreadsheet();    //Stores dashboard into a variable for later
  var template = SpreadsheetApp.openById('xxxxxx')    //Opens the project sheet template in the backend
  var nameEntry = getName();                                //Prompts user for the name of the new job file
  if (nameEntry == null){
    return;
  }

  SpreadsheetApp.setActiveSpreadsheet(template);            //Template is now the active sheet

  var newJobID = copySheet(nameEntry);                    //Creates a copy of the New Project template
  var newJobFile = DriveApp.getFileById(newJobID);

  newJobFile.AddEditors(['[email protected]','[email protected]');
  newJobFile.setOwner('[email protected]');
}

function getName(){
  var ui = SpreadsheetApp.getUi();
  var name = ui.prompt(                                      //Prompts the user for an input name      
    '',
    '?????-? Project Description',
    ui.ButtonSet.OK_CANCEL);
  var cancelCheck = name.getSelectedButton();
  if (cancelCheck == ui.Button.CANCEL || cancelCheck == ui.Button.CLOSE) {
    return null;
  } 
  var sheetName = name.getResponseText();
  return sheetName;
}

function copySheet(name) {
  var activeSS = SpreadsheetApp.getActive();
  var newFile = activeSS.copy(name)                       //Creates a copy of the New Project template

  SpreadsheetApp.setActiveSpreadsheet(newFile);              //Resets active spreadsheet to the recent copy
  activeSS = SpreadsheetApp.getActive();

  activeSS.getRange('A1').activateAsCurrentCell();
  activeSS.getCurrentCell().setValue(name);                  //Set cell A1 to the name of the file

  var newHyperlink = '=HYPERLINK("' + activeSS.getUrl() + '#gid=15580246",A1)';
  activeSS.getRange('A2').activateAsCurrentCell();
  activeSS.getCurrentCell().setValue(newHyperlink);

  return activeSS.getId();
}

С логами я вижу, что все работает как надо, за исключением метода .setOwner(). Он возвращает ошибку «Отказано в доступе». Я проверил все учетные записи Google, и каждая из них разрешила CustomScripts доступ к своему диску. Является ли .setOwner() устаревшим для учетных записей, не относящихся к рабочей области?

Я обновил исходные фрагменты, чтобы они соответствовали моему коду.

Я получил электронное письмо на днях об этом. Google прекратил неявный поток авторизации, поэтому, если вы используете этот тип потока авторизации в браузере, это может быть причиной вашей проблемы. Как вы вызываете функцию в скрипте Google Apps?

vinkomlacic 04.04.2022 22:19

Кроме того, вы пробовали проверить свой проект в облачной консоли Google?

vinkomlacic 04.04.2022 22:20

@vinkomlacic Он вызывается с помощью функции onOpen, которая создает меню панели инструментов, которое я называю «Создать», и под ним позволяет пользователям запускать 1 из 3 функций, которые копируют соответствующий шаблон для функции. Я не уверен, что вы имеете в виду, проверяя мой проект в облачной консоли.

ldraynor 04.04.2022 22:27

Вы можете назначить проект Google Cloud скриптам Google Apps, но я думаю, если вы не знаете об этом, вы, вероятно, не использовали его, и проблема не в этом :). Вы пытались очистить куки или запустить его в приватном браузере? Возможно, каждый раз передается старый недопустимый токен.

vinkomlacic 04.04.2022 22:31

Пробовал оба безуспешно. Из того, что я могу сказать, то, что они прекратили, было для сторонних приложений, использующих вход в Google. Этот скрипт основан на электронной таблице и не работает за пределами Google Диска.

ldraynor 04.04.2022 22:48

Можете ли вы поделиться скриншотом ошибки, которую вы получаете? Кроме того, я вижу, что вы используете метод getFileById, для которого требуется следующая область действия, и вы не видите его в своем коде: googleapis.com/auth/drive.readonly.

Lorena Gomez 05.04.2022 02:50

@LorenaGomez Он выдает «Исключение: доступ запрещен: DriveApp» в строке .setOwner() и не имеет других заметок. Я попытался добавить это разрешение, но это не сработало. В любом случае, не будет ли достаточно области действия для «../auth/drive»? или должны быть более уточнены разрешения

ldraynor 05.04.2022 15:45

Просто чтобы подтвердить, работал ли скрипт раньше под той же учетной записью, которую вы используете сейчас? Этот скрипт работает в учетной записи Google Workspace или в обычной учетной записи Gmail?

Lorena Gomez 06.04.2022 02:15

Да, скрипт проработал два года, все аккаунты остались прежними. Затем внезапно появляется сообщение «Отказано в доступе» при попытке использовать метод .setOwner(). Последний успешный запуск был 31 марта. Учетным записям снова было предложено разрешить CustomScripts доступ к файлам диска, начиная с апреля, когда их не просили с момента их первого использования (в разные периоды года). Он работает в обычной учетной записи Gmail.

ldraynor 06.04.2022 16:57

Я видел в сообщении сообщества Google App Script, что по крайней мере еще один человек столкнулся с этой проблемой с методом .setOwner(). Я нигде не видел, чтобы это устарело

ldraynor 06.04.2022 17:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У меня недостаточно репутации, чтобы комментировать, но я согласен с тем, что Лорена Гомес сказала, что это, вероятно, проблема с вашими OAuthScopes. Согласно Документация по скриптам приложений, для метода setOwner() класса File требуется область авторизации /auth/drive.

Похоже, у вас настроены как область /auth/drive, так и область /auth/drive.file, и я думаю, что более узкая область /auth/drive.file переопределяет более широкую область /auth/drive, которая необходимо вызвать setOwner().

Пробовали ли вы удалить область /auth/drive.file и запустить скрипт только с /auth/drive?

Я начал с "/auth/drive". Каждую новую авторизацию я добавлял позже, чтобы проверить, нужна ли она мне. Тем не менее, я только что попытался снова удалить более совершенные авторизации, и при попытке .setOwner() выдается то же самое «Исключение: доступ запрещен: DriveApp».

ldraynor 05.04.2022 15:49

Просто для ясности: все задействованные учетные записи являются учетными записями @gmail.com, верно? Google Workspace не позволяет передавать право собственности на файлы между доменами. Еще две мысли: 1) Является ли файл, который вы назначаете filecreated, типом файла, отличным от обычных типов, таких как документ Google Editor или PDF? Я думаю, что могут возникнуть проблемы с передачей права собственности на определенные типы файлов; и 2) вы дважды проверили, что учетная запись, выполняющая сценарий, уже является владельцем файла, который вы получаете? Только владельцы могут передавать права собственности, а не редакторы или другие уровни разрешений.

hank_r 06.04.2022 00:27

Я должен был загрузить свой код раньше, и за это я извиняюсь. Это обычная таблица Google, которую я использую в качестве шаблона. Я делаю копию на свой диск Google, а затем устанавливаю владельца в качестве учетной записи администратора. Он проработал два года, а потом внезапно перестал из-за отказа в доступе. Весь код работает по назначению, за исключением случаев передачи права собственности на электронную таблицу Google. Это не проблема синтаксиса или типа файла. Устарел ли Google метод .setOwner() для учетных записей, не относящихся к рабочей области?

ldraynor 06.04.2022 18:01
Ответ принят как подходящий

Судя по всему, изменился процесс передачи права собственности на файл между учетными записями потребителей. В соответствии с этим гид предполагаемый новый владелец должен принять запрос на передачу. См. пример ниже:

И я нашел этот статья, где вы можете видеть, что несколько месяцев назад процесс был другим, вы могли установить нового владельца сразу, не отправляя приглашение.

Я протестировал метод setOwner() с учетной записью Google Workspace, и он работает так, как в Google Workspace вы можете напрямую передавать права собственности на файлы между пользователями в одной организации, затем я протестировал тот же скрипт с учетной записью Gmail и попытался установить другую учетную запись Gmail как новый владелец и я получили одно и то же сообщение об ошибке: «Исключение: доступ запрещен: DriveApp».

Основываясь на всей информации, кажется, что такое поведение ожидается, поскольку процесс смены владельца файла для учетных записей Gmail теперь отличается, вы не можете напрямую установить нового владельца, человек, которого вы приглашаете, чтобы владеть файлом, должен принять ваш запрос для завершения передачи.

Огромное спасибо! Это имеет смысл относительно того, что я вижу

ldraynor 07.04.2022 22:10

Другие вопросы по теме