Удалить отправленный файл формы Google - PullRequest
1 голос
/ 16 мая 2019

КОД РАБОТЫ ЗДЕСЬ: https://jsfiddle.net/nateomardavis/e0317gb6/

ОРИГИНАЛЬНЫЙ ВОПРОС НИЖЕ

Как удалить файл, отправленный в форме, с самого диска?

У меня возникают проблемы с выяснением, почему форма Google отправляет файлы как на мой диск (не в папку), так и в автоматически созданную папку отправки.

Мне удалось переместить переименованный файл в новую папку и удалить копию в автоматически сгенерированной папке отправки. Я не могу понять, как удалить копию, которая только что перечислена в «Диск», а не в любой папке.

ПРОЦЕСС (РЕДАКТИРОВАТЬ)

Позвольте мне попытаться объяснить процесс подробнее. У меня есть форма, которая собирает файлы. Google автоматически создает папки и подпапки. Я успешно переименовал отправленные файлы, переместил их в новую папку и удалил из папки, созданной Google. Однако копия оригинального неизмененного файла отправляется в корневую папку Google Drive. Шаги 1-3 (ниже) работают как положено. Шаг 4, где я сталкиваюсь с проблемами.

  1. Исходный файл, загружаемый в форму. Обратите внимание на имя файла. enter image description here

  2. Папка, созданная Google. Файл отправлен в эту папку. enter image description here

  3. Переименованный файл в новой папке. Исходный файл удаляется из папки выше. enter image description here

  4. Исходный файл теперь отображается на диске, а не в папке, а там. Имя этого файла совпадает с первоначально загруженным. Тот, который пошел в папку «пас» и был затем удален из этой папки. enter image description here

SNIPPET

//RENAME PASSES
if (itemResponses[f].getItem().getTitle() == "PASSES") { 
var files = itemResponses[f].getResponse();
//Logger.log(files.length);
if (files.length > 0) {
  for (var n in files) {
    var dFile = DriveApp.getFileById(files[n]);
    dFile.setName("LSS - " + year + " - " + teamName + " - " + "PASSES - " + today );
    teamFolder.addFile(dFile);   //MOVE SUBMITTED DOCUMENTS TO THAT FOLDER
    passesFolder.removeFile(dFile); //REMOVE FROM SUBMISSION FOLDER
    DriveApp.getRootFolder().removeFile(dFile) // (DOES NOT WORK) REMOVE FROM DRIVE FOLDER
    DriveApp.removeFile(dFile) // (DOES NOT WORK) REMOVE FROM DRIVE FOLDER
  }
}

ПОЛНЫЙ КОД

function getLastResponse() {

  var form = FormApp.openById('ID');

  var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy hh:mm a");
  var year = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "YYYY");
  Logger.log(today);

  var formResponses = form.getResponses();
  //Logger.log(formResponses.length);
  var formResponse = formResponses[formResponses.length-1];
  var respondentEmail = formResponse.getRespondentEmail()
  var itemResponses = formResponse.getItemResponses();
  Logger.log(itemResponses.length);
  var teamName = itemResponses[2].getResponse();
  //Logger.log("team name: " + teamName);


  //CHECK FOLDERS
   var dropbox = "Lititz Summer Showcase Team Check In (File responses)";
    var folder, folders = DriveApp.getFoldersByName(dropbox);

    var teamBox = teamName;
    var teamFolder, teamFolders = DriveApp.getFoldersByName(teamBox);

    var passesFolder = DriveApp.getFolderById('ID');
    var rosterFolder = DriveApp.getFolderById('ID');
    var teamInfoFolder = DriveApp.getFolderById('ID');
    var permissionToTravelFolder = DriveApp.getFolderById('ID');

    if (folders.hasNext()) { //CHECK IF DRIVE HAS FOLDER FOR FORM
      folder = folders.next();
    } else { //IF NOT CREATE FOLDER
      folder = DriveApp.createFolder(dropbox);
    }

    if (teamFolders.hasNext()) {  //CHECK IF FOLDER FOR TEAM EXISTS 
      teamFolder = teamFolders.next();
    } else { //IF NOT CREATE FOLDER
      teamFolder = folder.createFolder(teamBox);
      teamFolder.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.COMMENT);
    }

for (var f = 0; f < itemResponses.length; f++) {
    Logger.log(itemResponses[f].getItem().getType());
    Logger.log(itemResponses[f].getItem().getTitle());
  if (itemResponses[f].getItem().getType() == "FILE_UPLOAD") {
    Logger.log("THERE IS A FILE UPLOAD");

    //RENAME PASSES
    if (itemResponses[f].getItem().getTitle() == "PASSES") { 
    var files = itemResponses[f].getResponse();
    //Logger.log(files.length);
    if (files.length > 0) {
      for (var n in files) {
        var dFile = DriveApp.getFileById(files[n]);
        dFile.setName("LSS - " + year + " - " + teamName + " - " + "PASSES - " + today );
        teamFolder.addFile(dFile);   //MOVE SUBMITTED DOCUMENTS TO THAT FOLDER
        passesFolder.removeFile(dFile); //REMOVE FROM SUBMISSION FOLDER
        DriveApp.removeFile(dFile); // REMOVE FROM DRIVE FOLDER
      }
    }
    //RENAME ROSTER
    } else if (itemResponses[f].getItem().getTitle() == "ROSTER") {
      var files = itemResponses[f].getResponse();
    //Logger.log(files.length);
    if (files.length > 0) {
      for (var n in files) {
        var dFile = DriveApp.getFileById(files[n]);
        dFile.setName("LSS - " + year + " - " + teamName + " - " + "ROSTER - " + today );
        teamFolder.addFile(dFile);

      }
    }
   //RENAME TEAM INFO SHEET
   } else if (itemResponses[f].getItem().getTitle() == "TEAM INFO SHEET") {
      var files = itemResponses[f].getResponse();
    //Logger.log(files.length);
    if (files.length > 0) {
      for (var n in files) {
        var dFile = DriveApp.getFileById(files[n]);
        dFile.setName("LSS - " + year + " - " + teamName + " - " + "TEAM INFO SHEET - " + today );
        teamFolder.addFile(dFile);
      }
    }

  //RENAME PERMISSION TO TRAVEL
  } else if (itemResponses[f].getItem().getTitle() == "PERMISSION TO TRAVEL") {
      var files = itemResponses[f].getResponse();
    //Logger.log(files.length);
    if (files.length > 0) {
      for (var n in files) {
        var dFile = DriveApp.getFileById(files[n]);
        Logger.log(ownerEmail);
        dFile.setName("LSS - " + year + " - " + teamName + " - " + "PERMISSION TO TRAVEL - " + today );
        teamFolder.addFile(dFile);
      }
    }
    }
}//END 'IF FILE UPLOAD'
}//END FOR LOOP


}//END FUNCTION

1 Ответ

1 голос
/ 18 мая 2019

Как насчет этого ответа?

Проблема:

Процесс загрузки из формы Google выглядит следующим образом.

  1. Когда файл загружается в форму, файл создается в корневой папке.
  2. Когда форма отправлена, файл в корневой папке копируется путем переименования имени файла в папку, созданную формой.

В приведенном выше случае файл в корневой папке отличается от файла в папке, созданной формой Google.Таким образом, DriveApp.getRootFolder().removeFile(dFile) в вашем «SNIPPET» не работает.Это является причиной вашей проблемы со скриптом.

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

  • Вы хотите удалить файл, оставшийся в корневой папке.

Для того, чтобычтобы удалить файл, созданный в корневой папке, как насчет этого обходного пути?

К сожалению, исходное имя файла не может быть получено из ответа формы.Но файл, который был скопирован в папку, созданную формой, имеет имя файла в формате, подобном {original filename} - ####.{extension}.В этом обходном пути исходное имя файла извлекается из этого имени файла и перемещает файл в корзину с использованием восстановленного исходного имени файла.

Пример сценария:

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

Перед запуском сценария:

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

  1. После того, как справитесь и вставьте скрипт в редактор скриптов, пожалуйста, укажите для скрипта ID папки назначения.
  2. пожалуйста, установите устанавливаемый триггер отправки формы.Если триггер уже установлен, удалите его и установите снова.
  3. Загрузите и отправьте файл с помощью формы Google.Таким образом, скрипт запускается.

Сценарий:

function formsubmit(e) {
  var destFolderId = "###"; // Destination folder ID

  if (e) {
    Utilities.sleep(3000); // This is required.
    var destfolder = DriveApp.getFolderById(destFolderId);
    var items = e.response.getItemResponses();
    for (var i = 0; i < items.length; i++) {
      if (items[i].getItem().getType() == "FILE_UPLOAD") {
        var files = items[i].getResponse();
        for (var j = 0; j < files.length; j++) {
          var file = DriveApp.getFileById(files[j]);
          var filename = file.getName();

          // Move uploaded file to the destination folder.
          var uploadedFile = DriveApp.getFileById(files[j]);
          var sourcefolder = uploadedFile.getParents().next();
          destfolder.addFile(file);
          sourcefolder.removeFile(file);

          // Retrieve original filename.
          var p1 = filename.split(" - ");
          var extension = p1[p1.length - 1];
          p1.pop();
          var name = p1.join(" - ");
          var p2 = "";
          if (extension.indexOf(".") > -1) {
            p2 = "." + extension.split(".")[1];
          }
          var orgFilename = name + p2;

          // Move uploaded file to the trash.
          var orgFiles = DriveApp.getRootFolder().getFilesByName(orgFilename);
          if (orgFiles.hasNext()) {
            var orgFile = orgFiles.next();
            orgFile.setTrashed(true);
          }
        }
      }
    }
  } else {
    throw new Error("This sample script is run by the installable form submit trigger.");
  }
}

Примечание:

  • Это простой пример сценария для объясненияэтот обходной путь.Поэтому, пожалуйста, измените это для вашей ситуации.
  • В моей среде было обнаружено, что Utilities.sleep(3000) требуется.Когда файл загружен и файл скопирован, запускается установленный триггер отправки формы.В это время, если Utilities.sleep(3000) не используется, файл перемещается до завершения копирования файла.При этом возникает ошибка.Так что я использовал это.
    • Но я не уверен, что время ожидания в 3 секунды является лучшим.Поэтому, если в вашей среде происходит ошибка, пожалуйста, измените это.
    • Я думаю, что при загрузке большого файла это значение может потребоваться большим.Кроме того, я думаю, что выполнение сценария с помощью запускаемого по времени триггера может быть лучше.
  • В этом примере сценария я использовал устанавливаемый триггер отправки формы.И когда форма отправлена, исходный файл в корневой папке перемещается в корзину.
    • Но я думаю, что вы также можете запустить скрипт с помощью триггера, управляемого временем.В этом случае вы можете получить элементы ответа, открыв форму.Об этом, пожалуйста, выберите для вашей ситуации.

Ссылки:

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