Используя API накопителя, как скопировать электронную таблицу, не нарушая сценарии? - PullRequest
1 голос
/ 11 февраля 2020

Я использую функцию копирования Google Drive API v3 для копирования электронной таблицы (согласно https://developers.google.com/drive/api/v3/reference/files/copy)

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

enter image description here

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

Мне интересно, если это ошибка, или есть какой-то особый прием для копирования документ листов Google через API привода, когда у них есть сценарии? может быть странная проблема с правами доступа?

Для справки, код, который выполняет копирование, использует. 1071 * core google libs для доступа к API

, который я написал в виде простой оболочки: -

 public File CopyFile(File destination, string sourceId)
 {
    var copyRequest = _driveService.Files.Copy(destination, sourceId);
    copyRequest.Fields = "id";
    return copyRequest.Execute();
 }

, который до сих пор отлично работает для всего, кроме листов Google и скриптов.

Сами сценарии, кажется, не имеют эффекта, самый простой сценарий, такой как

function onEdit(e){ Logger.log("hi") }

, не будет работать.

одна интересная вещь, когда он копирует файл, у проекта, похоже, нет владельца, как у исходного файла, из которого он был скопирован. Доступ к API осуществляется через учетную запись службы Google, которая (кажется) не является первоклассным пользователем «G Suite». Не уверен, если это является частью проблемы или нет.

enter image description here

ОБНОВЛЕНИЕ: 13 / февраля / 2020

Это похоже на проблему с разрешениями, связанную с учетными записями служб, я пока не знаю, как ее полностью решить.

Существует как минимум три основных шага, чтобы начать исправление этой проблемы

  1. вам нужно включить «делегирование по всему домену» в своей учетной записи службы в разделе учетных данных консоли google
  2. Вам необходимо получить администратора GSuite для предоставления разрешений учетной записи службы согласно https://developers.google.com/admin-sdk/directory/v1/guides/delegation Самая большая проблема заключается в том, чтобы знать, какие области назначить его, до сих пор я назначил его https://www.googleapis.com/auth/drive и https://www.googleapis.com/auth/spreadsheets
  3. При подключении к API при аутентификации вам нужно сказать, кого вы хотите выдать себя за другого ... C# выглядит следующим образом ...
ServiceAccountCredential credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(serviceAccountEmail)
                {
                    Scopes = Scopes,
                    User = "realuserinGsuite@yourdoman.wherever"

                }.FromCertificate(certificate));

Это означает, что учетная запись службы будет действовать так, как если бы это был пользователь.

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

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

Так что мне интересно, есть ли еще что-то, что я делаю неправильно? или это просто странный эффект, который может произойти в G-Suite?

enter image description here

1 Ответ

2 голосов
/ 12 февраля 2020

Ситуация:

  1. Скопируйте электронную таблицу, включая скрипт Google Apps, используя учетную запись службы.
  2. Поделитесь скопированной таблицей с учетной записью Google.
  3. Запустите сценарий в вашей учетной записи Google.

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

В моем окружении с помощью вышеупомянутого потока я мог бы воспроизвести вашу ситуацию. В этом случае я мог бы подтвердить с помощью Google Apps Script в качестве примера сценария.

Причина проблемы:

Я думаю, что причина этой проблемы в том, что для запуска сценария пользователь (владелец) обязателен. К сожалению, служебная учетная запись является пользователем как фиктивным пользователем. Таким образом, учетная запись службы не может быть владельцем для запуска сценария. Поэтому я думаю, что сценарий не сломан в этой ситуации. И я думаю, что это то же самое соображение, которое вы упомянули в последнем разделе вашего вопроса. Например, API Сценария Служб для использования Сценария Служб Google нельзя использовать с учетной записью службы. Ссылка Я думаю, что это также может быть актуально.

Обходной путь:

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

Если я неправильно понял ваш вопрос и это было не то направление, которое вы хотите, я прошу прощения.

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