Post file to Google App Script to upload it to Drive

842 Views Asked by At

i have a web page that i will use collect file from anyone and store it to my google drive (not theirs) then list the file name and url in a spreadsheet. for that purpose i choose to use gas as the interface between my page and my drive, something like this:

my page --> GAS --> drive

my page has form like this:

<form action="https://script.google.com/macros/s/some-random-string/exec"
    method="post" enctype="multipart/form-data">
    <input required type="file" name="thefile" id="thefile"><br />
    <input type="submit" value="Upload File" name="submit">
</form>

gs file:

var spreadSheetId = 'string-of-my-spreadsheet';
function doPost(e) {
  if(typeof e !== 'undefined'){
    try {
      var folderName = "myfolder";
      var folder, folders = DriveApp.getFoldersByName(folderName);
      if (folders.hasNext()) {
        folder = folders.next();
      } else {
        folder = DriveApp.createFolder(folderName);
      }
      
      var blob = e.parameter.thefile;
      var fname = blob.getName();
      var extensionfinder = /(?:\.([^.]+))?$/; 
      var ext = extensionfinder(fname)[1];
      
      var sheet = SpreadsheetApp.openById(spreadSheetId).getActiveSheet();
      var lastRow = sheet.getLastRow();
      var firstCellInRowVal = sheet.getRange(lastRow, 1).getValue();
      var newNameArr = firstCellInRowVal.split("-");
      var newName;
      if (newNameArr[0] == "File") {
        newName = newNameArr[0]+"-"+(parseInt(newNameArr[1])+1);
      }
      else {
        newName = 'File-1';
      }
      
      blob.setName(newName+'.'+ext);
      var file = folder.createFile(blob)
      var targetRange = sheet.getRange(lastRow+1, 1, 1, 2).setValues([[newName, file.getUrl()]]);
      return ContentService.createTextOutput(newName);
    }
    catch (error) {
      return ContentService.createTextOutput(error.toString());
    }
  }
}

GAS returns this error:

TypeError: Cannot call method "getName" of undefined.

anyone has solution for this? thx before..

1

There are 1 best solutions below

1
On

Your code

var blob = e.parameter.thefile;

is just getting the file. To get the blob you would have to use .getBlob() so your final code would be:

 var blob = e.parameter.thefile.getBlob();
 var fname = blob.getName();