Отключить автоматическую отправку уведомлений об общих документах

У меня есть файл Google, содержащий записи; в частности, столбец A содержит URL-адрес, которым я хочу поделиться с получателями, которых я ввожу в столбцы B и C. Я хочу поместить этих получателей в редактор соответствующего URL-адреса, но без отправки уведомления.

Я пробую этот код:

function partagerFichiers() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Feuille 1");
  let data = sheet.getDataRange().getValues();
  let fichierUrl, destinataireEd1, destinataireEd2, destinataireCom, destinataireLec;
  for (i=1;i<=data.length;i++) {
    if (data[i].length > 1 && data[i][0] !== "") { //on récupère la 1ère colonne
      fichierUrl = data[i][0];}
    if (data[i].length > 1 && data[i][2] !== "") {
      destinataireEd1 = data[i][2].split(";").map(function(item) { return item.trim(); });} //on récupère la 3ème colonne
    if (data[i].length > 1 && data[i][3] !== "") {
      destinataireEd2 = data[i][3].split(";").map(function(item) { return item.trim(); });} //on récupère la 4ème colonne

    try {
      let fichierId = fichierUrl.replace(/.*/d//, '').replace(//.*/, '');
      let fichier = DriveApp.getFileById(fichierId);
      destinataireEd1.forEach(function(mail) { fichier.addEditor(mail); });
      destinataireEd1.forEach(destinataireEd1 => {
      Drive.Permissions.create({ role: "writer", type: "user", emailAddress: destinataireEd1 }, fichier, { sendNotificationEmail: false });});
      destinataireEd2.forEach(function(mail) { fichier.addEditor(mail); });
    } catch (error) {
      Logger.log("Erreur lors de la récupération du fichier pour l'url: " + fichierUrl);
      Logger.log("Erreur :" + error.message);
    }
  }
}

Но я получаю несколько ошибок: «Ошибка: диск не определен» и «Ошибка: неверный аргумент: разрешение.значение» (последняя, ​​я думаю, связана с тем, что у меня нет обратного адреса для определенных записей)

Спасибо

Включили ли вы Drive API в облачной консоли?

Cooper 11.03.2024 22:11

@Купер, ну нет, признаюсь, я даже не совсем понимаю, что это значит.

Nicolas 11.03.2024 22:17

Это означает, что Drive в вашем проекте не определен.

Cooper 11.03.2024 22:18

То есть я не могу использовать его без учетной записи Google?

Nicolas 11.03.2024 22:21

Я не думаю, что вы можете запустить любой скрипт приложений Google без учетной записи Google.

Cooper 11.03.2024 22:23

В этом случае, если вы хотите включить Drive API, вам придется сделать его проектом GCP. Посмотрите в разделе передач вашего редактора скриптов.

Cooper 11.03.2024 22:25

Скрипт работает, если я удалю строку «Drive.Permissions.create({ role: «writer», type: «user», emailAddress: ReceiverEd1 }, file, { sendNotificationEmail: false });});'

Nicolas 11.03.2024 22:25

Есть разница между проектом GCP и учетной записью Google.

Cooper 11.03.2024 22:26

Похоже, что метод file.addEditor(mail) в вашем скрипте выполняет ту же задачу, что и ваш Drive.Permissions.create ( который является одним из методов Drive API Advanced Google), предоставляя редактору доступ к указанным адресам электронной почты, поэтому нет необходимости использовать эту строку кода. Кроме того, просто для подтверждения: вы намерены предоставить доступ к редактору только для каждого идентификатора файла без отправки уведомлений по электронной почте, верно?

SputnikDrunk2 11.03.2024 23:47

@SputnikDrunk2 Да, верно: я хочу предоставить только доступ к редактированию для каждого идентификатора файла без отправки уведомлений по электронной почте.

Nicolas 12.03.2024 06:27
Стоит ли изучать 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
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположение

Если вы хотите поделиться файлами с получателями, не получая от них уведомлений по электронной почте, вы можете сделать это с помощью Advanced Drive Service Drive API для скрипта Google Apps. Вы на правильном пути, если используете Drive.Permissions.create. Кроме того, я изменил ваш существующий сценарий, чтобы сделать его более читабельным и эффективным, используя меньше циклов for и условных операторов if.

Для начала вам нужно будет включить расширенные службы Drive API в редакторе сценариев приложений (это исправляет Error: Drive is not defined), как показано ниже:

Измененный сценарий [ОБНОВЛЕНО]

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

function shareFiles() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Feuille 1");
  let data = sheet.getDataRange().getValues();

  const dataToBeProcessed = data.map((row, i) => {
    return i != 0 && row.map(cell => {
      try {
        return new RegExp("d/(.*)/", "gm").exec(cell)[1]; //extract file ID from the link
      } catch {
        return cell.trim().split(";") //split email addresses for recipient 1 / recipient 2
      }
    })
  }).filter(x => x); //filter non-important values

  //Process sheet file data
  dataToBeProcessed.forEach(data => {

    let fileId = data[0];
    let setRole = 'reader'; //Set the role here.

    try {
      data[1].forEach(editor1Recipient => {
        editor1Recipient != '' && (setRole == 'writer' ? setAsWriter(setRole, editor1Recipient, fileId) : setAsReader(setRole, editor1Recipient, fileId), console.info(`Successfully shared file ID: (${fileId}) to ${editor1Recipient} with a "${setRole}" role.`))
      });

      data[2].forEach(editor2Recipient => {
        editor2Recipient != '' && (setRole == 'writer' ? setAsWriter(setRole, editor2Recipient, fileId) : setAsReader(setRole, editor2Recipient, fileId), console.info(`Successfully shared file ID: (${fileId}) to ${editor2Recipient} with a "${setRole}" role.`));
      });

    } catch (e) {
      console.info('Encountered an error: \n' + e)
    }

  })
}

/** Update the file permissions based on 'fileId' for users who have previously been set as 'writers'. */
function setAsReader(setRole, recipient, fileId) {
  //Get the permissions from the file.
  try {
    const pullPermissions = () => {
      return Drive.Permissions.list(fileId).permissions.filter(res => res.type == 'user' && res.role != 'owner');
    }

    const result = pullPermissions().map(permission => Drive.Permissions.update({
      role: "reader"
    }, fileId, permission.id));

    console.info(result); //For backtracking purposes of this log, this contains the number of user shared permssions existing in the file that have been updated.
  } catch {//If there are no existing permission for the file with 'reader' privilege, create a 'reader' role for the file.
    setAsWriter(setRole, recipient, fileId);
  }
}

function setAsWriter(setRole, recipient, fileId){
  Drive.Permissions.create({ role: setRole, type: "user", emailAddress: recipient }, fileId, { sendNotificationEmail: true });
}

Демо

Образец файла листа:

Пример результата журнала:

Вторая ссылка (идентификатор файла: 1ZR_xvSQG_z-Ow7CKyKM82NEuGIEAYW2y) не была обработана из-за пустых ячеек получателя.

Пример файла (идентификатор файла: 1e6FO9UNX92VYuZVIzyUQ_MClLwc8tMAb):

Спасибо за ваш ответ, но когда я запускаю сценарий, ничего не происходит (включая его изменение для просмотра уведомлений: тогда я не получаю никаких уведомлений). Также отмечу, что некоторые ячейки могут не содержать адрес электронной почты. Мой файл: docs.google.com/spreadsheets/d/…

Nicolas 12.03.2024 19:15

Понятно. Я обновил свой сценарий и протестировал его на вашем образце. Надеюсь, поможет. Просто дайте мне знать, если у вас есть дополнительные вопросы.

SputnikDrunk2 13.03.2024 00:31

Все работает отлично: спасибо! И последний вопрос по этой теме: я тестировал возможность делиться адресами электронной почты с помощью «комментариев» или «читателей», что тоже работает. Единственная проблема в том, что если я во-первых поставлю адрес в редакторе, если во-вторых передам его "комментатору" или "читателю", то это не работает, он останется в редакторе. Как я могу сделать ?

Nicolas 13.03.2024 23:16

Пожалуйста. Я обновил пример сценария, добавив функцию с именем setAsReader, и вы можете передать fileId в качестве параметра. Эта функция использует Drive.Permissions.update для обновления прав доступа к файлу от записи к читателю. Для работы он использует идентификатор файла и идентификатор разрешения (который будет автоматически собран внутри функции). Вы можете поместить эту функцию внутри dataToBeProcessed и заменить исходный метод Drive.Permissions.create для тестирования.

SputnikDrunk2 14.03.2024 19:17

Я не понял, как мне следует/можно использовать новую функцию setAsReader.

Nicolas 14.03.2024 22:16

Позвольте мне обновить эту часть.

SputnikDrunk2 15.03.2024 18:38

Обновлен пример сценария: в методе dataToBeProcessed есть переменная setRole, в которой вы можете указать, хотите ли вы роль читателя или писателя. Это определит, добавит ли сценарий разрешение получателя в качестве чтения/записи или обновит существующего получателя исходным разрешением «записывающего» для «читателя» с помощью функции setAsReader.

SputnikDrunk2 15.03.2024 21:09

Я получаю сообщение об ошибке: «Обнаружена ошибка: GoogleJsonResponseException: вызов API для диска.permissions.create завершился ошибкой: неверный запрос. Сообщение пользователя: «К сожалению, у вас нет разрешения на общий доступ». Когда я смотрю на файл, который мне нужен. чтобы поделиться, я понимаю, что все люди, которым изначально был предоставлен общий доступ, удалены (затем он открывается только для чтения) -> Я предполагаю, что это потому, что я не являюсь владельцем файла (я работаю над файлом, которым я не являюсь) владелец; и когда я создаю файл и запускаю скрипт, он работает нормально)

Nicolas 15.03.2024 23:18

Это верно, поскольку вы не являетесь владельцем этих файлов, запуск сценария приведет к ошибке.

SputnikDrunk2 17.03.2024 03:21

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

Оптимизация скрипта Google Sheets для добавления раскрывающихся списков и формул в несколько строк
Как эффективно копировать границы (с форматированием и значениями) между таблицами Google?
Как получить доступ к фигурам внутри сгруппированных фигур на слайдах Google с помощью Apps Script?
Извлечение данных из XML с помощью скрипта Google Apps в электронную таблицу Google
Подключение Quickbooks OAuth через скрипт Google Apps
Фильтрация строк Google Sheet по группам (разделенные пустыми строками). Фильтрация объединенных записей
Автоматически копировать данные и использовать ячейку A1 в качестве ссылки на диапазон в Google Sheet
Автоматическое свертывание сгруппированных строк при закрытии файла
Эффективно добавляйте гиперссылку к только что замененному тексту в Google Slides
Веб-приложение GAS – отправьте форму в другую форму и отправьте еще раз, возвращая значение под кнопкой отправки