当 <input type="file"> 在提交的表单上为空白时出错(Google 应用程序脚本)

Error when <input type="file"> is blank on a submitted form (Google App Script)

我正在创建一个 Google 网络应用程序(它是一个 HTML 表单),它将文件上传到我的云端硬盘上的文件夹。不需要上传文件,因此有时此输入实际上是 "blank"。该应用程序运行良好,除非您没有选择要上传的文件。它吐出这个错误:"Exception: We're sorry, a server error occurred. Please wait a bit and try again." 我有两个文件,html 文件和 .gs 文件。它们是:

/* The script is deployed as a web app and renders the form */
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('FormFrontend.html');
}

/* This function will process the submitted form */
function uploadFiles(form) {
  try {
    /* Name of the Drive folder where the files should be saved */
    var dropfolder = "Uploaded Files";
    var folder, folders = DriveApp.getFoldersByName(dropfolder);

    /* Find the folder, create the folder if it does not exist */
    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      folder = DriveApp.createFolder(dropfolder);
    }

    /* Get the file uploaded though the form as a blob */
    var blob = form.myFile;
    var file = folder.createFile(blob);
    var urlstr = file.getUrl()

    /* Set the file description as the name of the uploader */
    file.setDescription("Uploaded by " + form.ContactName);

    /* Write response to spreadsheet */
    var ss = SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
    var responses = ss.getSheetByName("Responses");
    responses.appendRow([form.CompanyName, form.ContactName, form.PhoneNumber, form.Email, form.Date, form.Severity, form.Details, urlstr])

    /* As long as there's no errors you should se the below text */
    return "Form Submitted Successfully "

  } catch (error) {

    /* If there's an error, show the error message */
    return error.toString();
  }

}
<html>

<body>
  <!-- This is the actual HTML form -->
  <div id="theform">
    <form id="myForm">

      <p style="font-size:30px">Customer Form</p>

      Company Name:
      <input type="text" name="CompanyName">
      <br>Contact Name:
      <input type="text" name="ContactName">
      <br>Phone Number:
      <input type="text" name="PhoneNumber">
      <br>Contact Email:
      <input type="email" name="Email">
      <br>Date:
      <input type="date" name="Date">
      <br>Overall Severity: (1 Lowest, 5 Highest)
      <br>
      <input type="number" name="Severity" min="1" max="5" value="1">
      <br>Details:

      <br>
      <textarea name="Details" rows=10 cols=65></textarea>
      <br>
      <br>Additional File (Optional):
      <input type="file" name="myFile">
      <br>

      <!-- The submit button. It calls the server side function uploadFiles() on click -->
      <input type="submit" value="Submit" onclick="this.value='Submitting..';
                    google.script.run.withSuccessHandler(fileUploaded)
                    .uploadFiles(this.parentNode);
                    return false;">
    </form>
  </div>

  <!-- Here the results of the form submission will be displayed -->
  <div id="output"></div>
</body>

</html>

<!-- The function will be called after the Google Script has executed -->
<script>
  function fileUploaded(status) {
    document.getElementById('myForm').style.display = 'none';
    document.getElementById('output').innerHTML = status;
  }
</script>

如果尝试在“/* 通过表单将文件作为 blob */”部分放置一个 IF 语句,告诉它如果 form.myFile 为空,则将 urlstr 设置为空,但是它仍然失败(但如果您选择一个实际文件,它仍然会成功完成)。我也无法在记录器中显示任何有用信息。

我是 Google App Script 的新手,如有任何帮助,我们将不胜感激!

我会检查实际上是什么 return 进入了变量 blob

var blob = form.myFile;

也许用JavaScripttypeOf检查类型。

var whatsTheType = typeOf blob;

在这个测试函数中:

function testIt() { 
  var newTestFile = DriveApp.createFile('New Text File', 'Hello, world!');
  var myBlob = newTestFile.getBlob();

  var whatsTheType = typeof myBlob;
  Logger.log('whatsTheType: ' + whatsTheType);
}

JavaScript typeof return 作为 "object" 的 blob 类型。如果您检查 typeof,它不是对象,则文件未上传。

放入 if 条件检查,而不是 "try/catch"。 "try/catch" 显然不能防止代码死亡。

if (whatsTheType === "object") {
  //Create the file
  var file = folder.createFile(blob);
};

或者,如果文件已上传,您应该能够检查文件选择器的 value 属性 是否为 return 名称。如果上传的文件没有名称,则用户没有使用文件选择器。

这就是最终的效果。 .getContentType 似乎总是 return "application/octet-stream" 当它留空并检查 returned 内容类型是否是特定的有效内容类型时。

/* Get the file uploaded though the form as a blob */
var blob = form.myFile;
var contentType = blob.getContentType();

if (contentType != "application/octet-stream") {
    var file = folder.createFile(blob);
    var urlstr = file.getUrl();
    /* Set the file description as the name of the uploader */
    file.setDescription("Uploaded by " + form.ContactName);
 } else {
    var urlStr = "None given";
 }