Загрузка нескольких файлов в одну папку с одной отправкой формы - PullRequest
1 голос
/ 11 апреля 2019

Я создал пользовательскую форму Google, которая позволяет вошедшему в систему пользователю Google включать в форму несколько файлов.Файлы загружаются во вновь созданную папку на Google Диске.Скрипт Google использует адрес электронной почты текущего пользователя + текущую дату и время в качестве имени папки.

Проблема и ожидаемый результат:

Из-за функции forEach скрипт загружает каждый файл вотдельная папка (с тем же именем).Я хотел бы загрузить каждый файл одна форма отправки в одну папку.

HTML:

<iframe name="hidden_iframe" id="hidden_iframe" style="display:none;" onload="if(submitted)  { picUploadJs(myForm); }"></iframe>
<form id="myForm" class="col s12" action="https://docs.google.com/forms/d/e/xxx/formResponse" target="hidden_iframe"  onsubmit="submitted=true;">
  <input placeholder="1234" name="entry.1234" id="user" type="text">
  <label for="user">User:</label>
  <input name="picToLoad" type="file" id="sampleFile" />
  <div id="status" style="display: none">
  Uploading. Please wait...
  </div>
  <button type="submit" name="action">Send</button> <!-- Modified -->
</form>

Javascript:

 function picUploadJs(myForm) {
    const f = document.getElementById("files");
    [...f.files].forEach((file, i) => {
    const fr = new FileReader();
    fr.onload = (e) => {
      const data = e.target.result.split(",");
      const obj = {fileName: file.name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
      document.getElementById('status').style.display = 'inline';
      google.script.run.withSuccessHandler(updateOutput).processForm(obj);
    }
    fr.readAsDataURL(file);
    });
  }

  function updateOutput() {
    var outputDiv = document.getElementById('status');
    outputDiv.innerHTML = "The File was UPLOADED!";
    window.location='https://Thankyou';
  }

Google Script:

function doGet(e) {
  Logger.log("doGet done");
  return HtmlService.createTemplateFromFile('test')
    .evaluate() // evaluate MUST come before setting the Sandbox mode
    .setTitle('Form')
    //.setSandboxMode();//Defaults to IFRAME which is now the only mode available
}

function processForm(theForm) {
  var dateTime = Utilities.formatDate(new Date(), "GMT+2", "dd-MM-yy_HH-mm");
  var email = Session.getActiveUser().getEmail();
  var parentFolder=DriveApp.getFolderById('xxxxx');  
  var newFolder=parentFolder.createFolder(email + "_" + dateTime);
  var newFolderId = DriveApp.getFoldersByName(newFolder).next().getId();

  var fileBlob = Utilities.newBlob(Utilities.base64Decode(theForm.data), theForm.mimeType, theForm.fileName);
  var fldrSssn = DriveApp.getFolderById(newFolderId);
  fldrSssn.createFile(fileBlob);
  return true;
}

1 Ответ

1 голос
/ 11 апреля 2019
  • Когда файлы отправляются, вы хотите создавать одну новую папку при каждой отправке.
  • Вы хотите загрузить несколько файлов в созданную папку.

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

Модифицированные сценарии:

HTML:

Пожалуйста, измените следующим образом.

С:
<input name="picToLoad" type="file" id="sampleFile" />
Кому:
<input name="picToLoad" type="file" id="files" multiple />

Javascript:

Пожалуйста, измените picUploadJs().

function picUploadJs(myForm) {
  const f = document.getElementById("files");
  google.script.run.withSuccessHandler((folderId) => { // Added
    var files = [...f.files];
    files.forEach((file, i) => {
      const fr = new FileReader();
      fr.onload = (e) => {
        const data = e.target.result.split(",");
        const obj = {fileName: file.name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
        document.getElementById('status').style.display = 'inline';
        google.script.run.withSuccessHandler(() => {
          if (i == files.length - 1) updateOutput();
        }).processForm(obj, folderId); // Modified
      }
      fr.readAsDataURL(file);
    });
  }).createFolder();
}

Сценарий Google Apps:

Я разделил processForm() на processForm() и createFolder().

// Added
function createFolder() {
  var dateTime = Utilities.formatDate(new Date(), "GMT+2", "dd-MM-yy_HH-mm");
  var email = Session.getActiveUser().getEmail();
  var parentFolder = DriveApp.getFolderById('xxxxx');
  var newFolder = parentFolder.createFolder(email + "_" + dateTime);
  var newFolderId = DriveApp.getFoldersByName(newFolder).next().getId();
  return newFolderId;
}

// Modified
function processForm(theForm, newFolderId) {
  var fileBlob = Utilities.newBlob(Utilities.base64Decode(theForm.data), theForm.mimeType, theForm.fileName);
  var fldrSssn = DriveApp.getFolderById(newFolderId);
  fldrSssn.createFile(fileBlob);
  return true;
}

Примечание:

  • В вашем HTML верхняя строка выглядит следующим образом.

    <form id="myForm" target="hidden_iframe" onsubmit="submitted=true;">
    

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

    <iframe name="hidden_iframe" id="hidden_iframe" style="display:none;" onload="if(submitted)  { picUploadJs(myForm); }"></iframe>
    <form id="myForm" action="https://docs.google.com/forms/d/e/xxx/formResponse" target="hidden_iframe" onsubmit="submitted=true;">
    

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

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