0

Since the NATIVE sandbox on google apps script is deprecated, I'm switching to IFRAME, which has caused some issues.

The basic outline of the app is that it should allow a user to fill in some information and upload a file (it also makes sure all required fields are completed). Upon submission (by clicking a button), the file should be uploaded to a folder in google drive and a spreadsheet should be updated with the user's information. When I'm in NATIVE, everything works fine. When I set it to IFRAME, nothing happens when I click the submit button.

This is a similar issue to here and here, but neither of them directly address my problem. I also tried following the Google Guide but it didn't help.

Here is my server.gs script:

function doGet(e) {
  return template = HtmlService.createHtmlOutputFromFile('form.html').setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function uploadFiles(form) {
  try {

    var dropbox = "Applications";
    var folder, folders = DriveApp.getFoldersByName(dropbox);

    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      folder = DriveApp.createFolder(dropbox);
    }

    var CV = form.CV;
    var foldername = form.myLastName + ", " + form.myFirstName;
    var myFolder = folder.createFolder(foldername);
    var file_CV = myFolder.createFile(CV);    

    var CV_url = file_CV.getUrl();

    var sheet_return = addApplicant(form, CV_url);

    return "Thank you for your submission."

  } catch (error) {
    return error.toString();
  }
}

function addApplicant(form, CV_url) {
  try {
    var d = new Date()
    var ss = SpreadsheetApp.openByUrl(***INSERT URL TO GOOGLE SHEETS PAGE***);
    SpreadsheetApp.setActiveSpreadsheet(ss);
    SpreadsheetApp.setActiveSheet(ss.getSheets()[0]);
    var sheet = SpreadsheetApp.getActiveSheet();

    if (form.visa != "Yes"){
      form.visa = "No"
    }

    sheet.appendRow([d, form.myFirstName, form.myLastName, form.myEmail, form.visa, CV_url]);

  } catch (error) {

    return error.toString();
  }
}

Here is my form.html script:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>

<!-- You can also include your own CSS styles -->
<link href='https://fonts.googleapis.com/css?family=Bitter' rel='stylesheet' type='text/css'>

<style type="text/css">
  .warning {border: 1px solid red !important; background: #fdecb2 !important;}
  .hideClass {display:none;}
</style>


<div class="form-style-10">
<title> Application </title>

<form id="myForm" name="myForm">

  <fieldset class="fields">
  <div class="section"> Personal Information </div>
  <div class="inner-wrap">
    <label for="myFirstName"> First Name* </label>
    <input type="text" id="myFirstName" name="myFirstName" placeholder="" required />

    <label for="myLastName"> Last Name* </label>
    <input type="text" name="myLastName" placeholder="" required />

    <label for="myEmail"> Email* </label>
    <input type="email" name="myEmail" placeholder="" required />

    <span class="visa-checkbox">
    Check if you will require visa assistance. <input type="checkbox" name="visa" value="Yes" /> 
    </span>
  </div>
  </fieldset>

  <fieldset class="fields">
  <div class="section"> Documents (pdf format is preferred) </div>
  <div class="inner-wrap">
    <label for="CV"> CV* </label>
    <input type="file" name="CV" required />
  </div>
  </fieldset>

  <p>  </p>
  <p id="incompleteWarning" class="hideClass"> Please check for incomplete fields and re-submit. </p>
  <p id="bePatient" class="hideClass"> Please be patient while the files are being uploaded. Do not close or refresh the form. </p>

  <input id="submitbutton" type="button" value="Submit Application" />     
</form>

<div id="output" class="hideClass">
<span id="ThankYou" >Thank you for taking the time to complete the application. 
    </span>
</div>

</div>

<script type="text/javscript">

document.getElementById('submitbutton').addEventListener("click", validatefunction);

function validatefunction() {
   document.getElementById('submitbutton').val = 'Submitting...';
   //check for required fields
   var j = 0;
   var form = document.getElementById('myForm');
   var elem = form.elements;
   for (var i = 0; i < elem.length; i++){
     elem[i].className = "";
     if (elem[i].value === "" && elem[i].hasAttribute('required')){
       elem[i].className = "warning";
       j++;
     }
   }

   if (j === 0) {
       var btn = document.getElementById('submitbutton');
       btn.disabled = true;
       document.getElementById('incompleteWarning').style.display = 'none';
       document.getElementById('bePatient').style.display = 'inline';
               google.script.run.withSuccessHandler(fileUploaded).uploadFiles(this.parentNode);
} else{
      document.getElementById('submitbutton').val = 'Submit Application';
      document.getElementById('incompleteWarning').style.display = 'inline';
      document.getElementById('incompleteWarning').style.color = 'red';
    }
};

</script>

<script>
    function fileUploaded(status) {
        document.getElementById('myForm').style.display = 'none';
        document.getElementById('output').style.display = 'inline';     
    }
</script>

<style>
 input { display:block; margin: 20px; }
</style>

 </body>
</html>
Community
  • 1
  • 1
LJB
  • 353
  • 4
  • 10

1 Answers1

1

Change:

<script type="text/javscript">

To:

<script language="javascript">

I don't know why it doesn't like type="text/javscript"

Alan Wells
  • 30,746
  • 15
  • 104
  • 152