首先,我从Sandy Good在以下链接中写的信息开始编写脚本。
Google Forms file upload complete example.
我做了她所说的一切,一切都奏效了。

以下是我已修改的.gs和.html文件,以通过网络表单要求其他信息。

我下面的脚本的问题是fileBlob没有从客户端传递到服务器端。我尝试更换

google.script.run.withSuccessHandler(updateOutput).processForm(frmData);




google.script.run.withSuccessHandler(updateOutput).processForm($( "#myForm" )[0]);


但这失败并给我以下错误

Uncaught Error: Cannot find method createFile((class)).


我发现是一个空的fileBlob。

此外,我尝试调用ID myFIle1,可以在控制台日志中看到该信息,但仍然遇到与上面相同的错误。

能否请大家浏览我的脚本并提供有关fileBlob为什么为空的信息。我是否错过了Google Developers网站或此网站上的内容?谢谢

代码

function doGet(e) {
  return HtmlService.createTemplateFromFile('Form')
    .evaluate() // evaluate MUST come before setting the Sandbox mode
    .setTitle('Name To Appear in Browser Tab')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

function processForm(theForm) {

  var emailAddress = theForm.email;
  var projectName = theForm.projectName;
  var zone = theForm.zone;
  var fileBlob = theForm.myFile1;

  var fldrSssn = DriveApp.getFolderById('folder ID');//you need to put your upload folder id here
  var igeURL = fldrSssn.createFile(fileBlob).getId();


Logger.log("Code completed")
  return true;
}


Form.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <?!= include('Stylesheet'); ?>
  </head>
  <body>
    <?!= include('JavaScript'); ?>

    <div id="GSAlogo">Insert Logo Band</div>
    <table id="CompTool">
    <tr><th><h1 id="header">Header Name</h1></th></tr>
    <tr><td id="toolInfo">Tool Info.</td></tr>
      <form id="myForm">
      <tr><td><input name="email" type="email" placeholder="Insert email address"/></td></tr>
      <tr><td>Select the project zone:</td></tr>
      <tr><td><select>
        <option name="zone" value="Arkansas Zone">Arkansas Zone</option>
        <option name="zone" value="Austin Zone">Austin Zone</option>
        <option name="zone" value="Border El Paso Zone">Border El Paso Zone</option>
        <option name="zone" value="Border McAllen Zone">Border McAllen Zone</option>
        <option name="zone" value="Border San Antonio Zone">Border San Antonio Zone</option>
        <option name="zone" value="Dallas East Texas Zone">Dallas East Texas Zone</option>
        <option name="zone" value="Fort Worth Zone">Fort Worth Zone</option>
        <option name="zone" value="Houston Zone">Houston Zone</option>
        <option name="zone" value="Louisiana Zone">Louisiana Zone</option>
        <option name="zone" value="New Mexico Zone">New Mexico Zone</option>
        <option name="zone" value="Oklahoma East Zone">Oklahoma East Zone</option>
        <option name="zone" value="Oklahoma West Zone">Oklahoma West Zone</option>
        <option name="zone" value="West Texas Zone">West Texas Zone</option>
      </select></td></tr>
      <tr><td><input type="text" name="projectName" value="test folder" placeholder="Please enter a project name"></td></tr>
      <tr><td><input name="myFile1" id="myFile1" type="file" accept=".xls,.xlsx" /></td></tr><br/>
      <tr><td><input type="button" id="formSave" value="Submit" style="background-color:#00449e; color:white;" onclick="disable(); fileUploadJS(this.parentNode)"/></td></tr><br/>

      </form>
      <br/>
      <br/>
      <tr><td id="status" style="display: none">
    <!-- div will be filled with innerHTML after form submission. -->
    Uploading. Please wait...
    </td></tr>
</table>
</body>
</html>


Javascript.html

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
<script>

function disable(){
  var fS = document.getElementById('formSave');
  fS.disabled = true;
  fS.style.color = "black";
  fS.style.backgroundColor = "gray";
}

function fileUploadJS(frmData) {

  document.getElementById('status').style.display = 'inline';

/*
    The script below worked for passing the information to the client side but the fileBlob is blank


  var formData = document.getElementById('myForm');
  var email = formData[0].value;
      console.log('email: ' + email);
  var zone = formData[1].value;
      console.log('zone: ' + zone);
  var projectName = formData[2].value;
      console.log('projectName: ' + projectName);
  var fileBlob = formData[3];
      console.log('fileBlob: ' + fileBlob);
  var fileName = fileBlob.name;
      console.log('fileName: ' + fileName);
  var fileType = fileBlob.type;
      console.log('fileType: ' + fileType);
  var fileValue = fileBlob.value;
      console.log('fileValue: ' + fileValue);
  var fileFiles = fileBlob.files;
      console.log('fileFiles: ' + fileFiles);

  var modFormData = [email, zone, projectName, fileBlob];
*/


  google.script.run
    .withSuccessHandler(updateOutput)
    .processForm(frmData);
}
  // Javascript function called by "submit" button handler,
  // to show results.

  function updateOutput() {

    var outputDiv = document.getElementById('status');
    outputDiv.innerHTML = "Your file was uploaded.";
    console.log('script completed.')
  }

  function onFailure(error) {
    var div = document.getElementById('status');
    div.innerHTML = "ERROR: " + error.message;
  }
</script>

最佳答案

首先,解决方案信息来自here

将表单标签移到表格标签之外。

之前:

<table id="CompTool">
<tr><th><h1 id="header">Header Name</h1></th></tr>
<tr><td id="toolInfo">Tool Info.</td></tr>
<form id="myForm">


后:

<form id="myForm">
<table id="CompTool">
<tr><th><h1 id="header">Header Name</h1></th></tr>
<tr><td id="toolInfo">Tool Info.</td></tr>


另外,我必须在select标记中添加一个名称,以便selectedd选项可以传递到服务器端脚本。

之前:

  <tr><td><select>


后:

  <tr><td><select name="zone">

10-06 00:06