Form and file upload with htmlService and app script not working

后端 未结 1 1663
春和景丽
春和景丽 2020-11-28 11:08

I\'m trying to upload a file to a specific google drive folder along with form data into a spreadsheet. The spreadsheet portion of this code works, but the file upload funct

1条回答
  •  再見小時候
    2020-11-28 11:29

    Edit: Working example

    The HtmlService does not support the post method for HTML forms. The input elements collected by a form can be communicated to a server-side function using a handler function instead. For more details, see HTML Service: Communicate with Server Functions.

    Here's an example based on the code you've posted in your question.

    Form.html

    
    
    
    Name:
    Department:
    Email:
    Message:
    School Schedule (Image Files Only):

    Thanks.html

    Thanks

    Thank you for your submission.

    Name:
    Department:
    Message:
    Email:
    File URL:

    Code.gs

    var submissionSSKey = '--Spreadsheet-key--';
    var folderId = "--Folder-Id--";
    
    function doGet(e) {
      var template = HtmlService.createTemplateFromFile('Form.html');
      template.action = ScriptApp.getService().getUrl();
      return template.evaluate();
    }
    
    
    function processForm(theForm) {
      var fileBlob = theForm.myFile;
      var folder = DriveApp.getFolderById(folderId);
      var doc = folder.createFile(fileBlob);
      
      // Fill in response template
      var template = HtmlService.createTemplateFromFile('Thanks.html');
      var name = template.name = theForm.name;
      var department = template.department = theForm.department;
      var message = template.message = theForm.message;
      var email = template.email = theForm.email;     
      var fileUrl = template.fileUrl = doc.getUrl();
      
      // Record submission in spreadsheet
      var sheet = SpreadsheetApp.openById(submissionSSKey).getSheets()[0];
      var lastRow = sheet.getLastRow();
      var targetRange = sheet.getRange(lastRow+1, 1, 1, 5).setValues([[name,department,message,email,fileUrl]]);
      
      // Return HTML text for display in page.
      return template.evaluate().getContent();
    }
    

    Original answer, which was focused on basic debugging:

    Where does this code come from originally? There have been multiple questions about it, and it might be helpful to see the original tutorial or example it was taken from.

    When you run this code as a published web app, and submit a file, the error you receive is TypeError: Cannot read property "thefile" from undefined. Without any more digging, this tells you that there's an undefined object being used in your code. What object is that? Don't know yet, but a clue is that the code is looking for a property named "thefile".

    If you have the script open in the editor, and launched the webapp from there (by clicking on Test web app for your latest code in the Publish / Deploy as Web App dialog), then you can also check the Execution Transcript for more details. (under View menu) You'll find it contains something like this:

    [13-12-25 07:49:12:447 EST] Starting execution
    [13-12-25 07:49:12:467 EST] HtmlService.createTemplateFromFile([Thanks.html]) [0 seconds]
    [13-12-25 07:49:12:556 EST] SpreadsheetApp.openById([--SSID--]) [0.089 seconds]
    [13-12-25 07:49:12:557 EST] Spreadsheet.getSheets() [0 seconds]
    [13-12-25 07:49:12:626 EST] Sheet.getLastRow() [0.067 seconds]
    [13-12-25 07:49:12:627 EST] Sheet.getRange([1, 1, 1, 5]) [0 seconds]
    [13-12-25 07:49:12:629 EST] Range.setValues([[[N/A, , Select Option, , ]]]) [0.001 seconds]
    [13-12-25 07:49:12:983 EST] Execution failed: TypeError: Cannot read property "thefile" from undefined. (line 20, file "Code") [0.17 seconds total runtime]
    

    We see that same error, but now we know the line number. That line contains a spelling mistake:

    var fileBlob = e.paramater.thefile
                     ^^^^^^^^^
    

    0 讨论(0)
提交回复
热议问题