Создать копию файла на моем Диске и разместить на Диске другого пользователя в том же домене - PullRequest
1 голос
/ 05 мая 2020

Как мне сделать так, чтобы когда сотрудник запускал сценарий для создания копий файла и распространения их в другие папки, он также мог помещать их в папки на дисках других сотрудников? Мы находимся в одном домене и используем G Suite.

Мой сценарий предназначен для расписания. Предполагается:

  1. создать копию, добавить имя с идентификатором пользователя и отметкой времени, а затем поместить копию в папку на Диске сотрудника, чтобы у него была копия,
  2. повторите это и поместите вторую копию в папку на моем Диске, чтобы у меня была копия без предоставления сотруднику общего доступа, и чтобы сотрудник не мог позже редактировать мою копию

Это сработало хорошо, когда я сам тестировал. Затем я поделился им с коллегой из того же домена и с моей личной учетной записью Google. Мы оба создали копию на наших Дисках (его рабочий Диск, мой личный Диск). Тогда мы больше не работали с оригиналом. Это сделано намеренно, потому что я не хочу, чтобы сотрудники касались оригинала. Когда мы запускали сценарий, он не смог создать копию на наших Дисках или моем рабочем Диске.

«Исключение: не удалось найти элемент с данным идентификатором, или у вас нет разрешения на доступ к нему».

вот мой код:

function submit() {
  //variables
  var ss = SpreadsheetApp.getActive();
  var destFolderMgr = DriveApp.getFolderById(my folder id is here);
  var destFolderEmp = DriveApp.getFolder;
  var empName = Session.getActiveUser()
  var timeStamp = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), 'MM-dd-yyyy');
  var newName = ss.getName() + " " + empName + " " + timeStamp;

  //copy sheet
  //append name with today's date and employee name
  //place in employee's folder
  DriveApp.getFileById(ss.getId()).makeCopy(newName,destFolderEmp)

  //copy sheet
  //append name with today's date and employee name
  //place in manager's folder
  DriveApp.getFileById(ss.getId()).makeCopy(newName,destFolderMgr)

}

1 Ответ

1 голос
/ 06 мая 2020

Проблема:

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

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

Как сказал Купер, хороший способ обойти эту проблему - развернуть ваше приложение как веб-приложение и, при его развертывании, установить « Запустите приложение как"для вас. Таким образом, даже если к этому веб-приложению обращаются другие пользователи, веб-приложение выполняется от имени вас и может получать доступ к тем же ресурсам, что и вы.

Я думаю, что самый простой способ сделать это - присвоить вашей функции имя doGet. Эта специально названная функция запускается каждый раз, когда кто-то делает GET запрос к URL-адресу веб-приложения (то есть каждый раз, когда кто-то обращается к этому URL-адресу). Таким образом, каждый раз, когда кто-то обращается к этому URL-адресу, копия файла создается в двух указанных папках.

Теперь я не знаю, как извлекается идентификатор папки сотрудника, в зависимости от того, какой пользователь запускает сценарий, но в самой функции вы можете объявить объект, содержащий пары ключ-значение, с разными почтовыми сообщениями сотрудников. и соответствующие идентификаторы папок.

Наконец, вы можете вернуть HtmlOutput в конце этой функции, чтобы проинформировать пользователей об успешном завершении процесса (вместо того, чтобы показывать ошибку, не возвращающую ничего ).

Это может быть что-то вроде этого:

Пример кода:

function doGet() {
  var ss = SpreadsheetApp.getActive();
  var empName = Session.getActiveUser();
  var employeeFolders = { // Employee emails and folder ID's
    emailEmployee1: "folder-id-1",
    emailEmployee2: "folder-id-2",
    emailEmployee3: "folder-id-3",
    //...
  }
  var empFolderId = employeeFolders[empName];
  var destFolderEmp = DriveApp.getFolderById(empFolderId);
  var destFolderMgr = DriveApp.getFolderById(my folder id is here);
  var timeStamp = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), 'MM-dd-yyyy');
  var newName = ss.getName() + " " + empName + " " + timeStamp;
  DriveApp.getFileById(ss.getId()).makeCopy(newName,destFolderEmp)
  DriveApp.getFileById(ss.getId()).makeCopy(newName,destFolderMgr)
  return HtmlService.createHtmlOutput("Copy made!");
}

После того, как вы скопировали этот код в свой проект, вы можете развернуть скрипт как веб app, если вы выполните эти шаги .

Примечание:

  • У вас должен быть доступ к папкам сотрудников, чтобы это работало.
  • Это - это самый простой способ сделать это, но можно добавить много деталей (обслуживание HTML страниц и предоставление пользователям возможности нажимать кнопку для запуска скрипта и т. д. c.). Я предлагаю вам прочитать ссылку на веб-приложения, которую я включил в ссылку, если вы хотите продолжить исследование.

Ссылка:

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