【问题标题】:Handling multiple files from an input element in an array with Google Apps Script使用 Google Apps 脚本处理来自数组中输入元素的多个文件
【发布时间】:2015-03-24 17:03:06
【问题描述】:

我有一个表单,它允许从下拉列表中选择一个项目并上传一个文件。项目的名称和 ID 保存在电子表格文档中。适用于一个文件...但我想上传多个文件。你能帮我修改一下脚本吗?

HTML 部分如下所示

<div class="col-md-4 col-sm-6 ">
           <div class="caption">
             <h3>Bildauswahl</h3>
             <p align="center"><input type="file" name="myFiles[]" id="myFiles" multiple></p>
         </div>
         </div>

我的脚本不工作,如下:

var dropBoxId = "XYZ"; 
var logSheetId = "ABC";

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('InputForm.html');
}

function uploadFiles(formObject) {
  try {
    // Create a file in Drive from the one provided in the form
    var folder = DriveApp.getFolderById(dropBoxId);
    var input = document.getElementById('myFiles');

    for (i = 0; i<input.files.length; i++) {
      var blob = input.files[i];
      var file = folder.createFile(blob);
      var ss = SpreadsheetApp.openById(logSheetId);
      var sheet = ss.getSheets()[0];
      sheet.appendRow([file.getName(), file.getUrl(), formObject.myName]);
    }


    // Return the new file Drive URL so it can be put in the web app output
    return file.getUrl();
  } catch (error) {
    return error.toString();
  }
}

谢谢。

【问题讨论】:

  • 首先,Google Apps 脚本中没有document.getElementbyId(),它是用于javascript的。您必须将这些文件传递给 formObject 变量到您的 uploadFiles() 函数。

标签: javascript arrays input google-apps-script


【解决方案1】:

到目前为止,您必须使用变通方法来处理多个文件。多重属性仅在 IFRAME 模式下有效,但文件输入在 IFRAME 模式下被破坏。

要查看此解决方法,请查看针对此问题的错误提交: https://code.google.com/p/google-apps-script-issues/issues/detail?id=4610

此外,在您的代码中,您还混合了服务器端和客户端代码,这些代码将无法正常工作:

var folder = DriveApp.getFolderById(dropBoxId); //server side
var input = document.getElementById('myFiles'); //client side

您需要在客户端处理多个文件

我想出了一个很好的多文件上传解决方案。限制是文件必须小于 10 MB。

代码.GS

function doGet() {
 return HtmlService.createHtmlOutputFromFile('index').setSandboxMode(HtmlService.SandboxMode.IFRAME);

}

function saveFile(data,name,folderId) {

var contentType = data.substring(5,data.indexOf(';'));
var file = Utilities.newBlob(Utilities.base64Decode(data.substr(data.indexOf('base64,')+7)), contentType, name);
  DriveApp.getFolderById(folderId).createFile(file);

}

index.html

<div>
 <input type="file"  id="myFiles" name="myFiles" multiple/>
 <input type="button" value="Submit" onclick="SaveFiles()" />
</div>

<script>

  var reader = new FileReader();
  var files;
  var fileCounter = 0;
  var folderId = "";




  reader.onloadend = function () {
   google.script.run
    .withSuccessHandler(function(){
      fileCounter++;      
      postNextFile();
    }).saveFile(reader.result,files[fileCounter].name,folderId);

  }



function SaveFiles(){
  var folderSelect = document.getElementById("folderSelectId");
  folderId = folderSelect.options[e.selectedIndex].value;
  files = document.getElementById("myFiles").files;  
  postNextFile();
 }


function postNextFile(){if(fileCounter < files.length){reader.readAsDataURL(files[fileCounter]);}else{fileCounter=0;alert("upload done")}}

</script>

【讨论】:

  • 感谢斯宾塞,这帮了大忙。我的目标是将文件保存到一个文件夹中,该文件夹的名称来自下拉项值。您能告诉我在创建文件夹而不是将文件保存到根目录时如何引用下拉菜单吗?
  • 检查上面的代码,了解如何将文件夹 ID 从选择传递到保存文件夹函数
  • 哇,我的代码运行起来了!你真的帮了我大忙。谢谢!
  • 这里也谢谢你:)
  • 不适合我。我一直按提交,但没有任何反应。我完全复制了代码。是浏览器的问题吗?使用 Chrome
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2020-06-11
相关资源
最近更新 更多