javascript - HTML 表单不使用 doPost 提交到电子表格

标签 javascript html google-apps-script

试图在现有线程中找到一些有用的答案,但没有任何内容真正符合我的问题。我想有一个快速修复方法,只是我看不到它。

我有一个 HTML 表单,想要将文件上传到我的 Google 云端硬盘(效果很好)并将文本字段保存到我的电子表格中(根本不起作用)。

我只是找不到这两个函数之间的任何主要区别,这令人沮丧!

在我的代码下方,这也是[我的公共(public)脚本的链接][1]。

表格:

<!DOCTYPE html>

<form id="myForm">
    <input type="text" name="myName" placeholder="Your name..">
    <input type="file" name="myFile">
<input type="submit" value="Upload File" 
       onclick="this.value='Uploading..';
                google.script.run.withSuccessHandler(fileUploaded)
                .uploadFiles(this.parentNode);
                return false;
                google.script.run.withSuccessHandler(fileUploaded)
                .doPost(this.parentNode);">
</form>

<div id="output"></div>

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

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



  [1]: https://script.google.com/d/1K9jGl7ALHCZ93rz8GoeV8t7PE_7vgbNZlLJed1h6ZWyuoon11gIbik24/edit?usp=sharing

server.gs:

function doGet(e) {
  var html = HtmlService.createTemplateFromFile("form");
  html = html.evaluate();
  html.setSandboxMode(HtmlService.SandboxMode.IFRAME);
  return html;  
}

function uploadFiles(form) {

  try {

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

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

    var blob = form.myFile;    
    var file = folder.createFile(blob);    
    file.setDescription("Uploaded by " + form.myName);

    return "File uploaded successfully " + file.getUrl();

  } catch (error) {

    return error.toString();
  }
}

function doPost(form) { // change to doPost(e) if you are recieving POST data
  html.setSandboxMode(HtmlService.SandboxMode.EMULATED);
  var name = form.myName;
  var url="url...";
  var message = 'Ram';
  var submitSSKey = '...kHI';
  var sheet = SpreadsheetApp.openById(submitSSKey).getActiveSheet();
  var lastRow = sheet.getLastRow();
  var targetRange = sheet.getRange(lastRow+1, 1, 2, 2).setValues([[name,url]]);
}

感谢您的热心帮助!

马丁

最佳答案

如果您要使用 google.script.run,那么拥有名为 doPost() 的函数就没有意义。并且拥有提交类型输入标记也是毫无意义的: type="submit"

如果您想运行 withSuccessHandler(fileUploaded) 来更改显示,则表单内不能有按钮。这将导致显示屏变为空白。

而且您不需要两次 google.script.run 调用。您需要进行多项更改和改进:

form.html

<form id="myForm">
  <input type="text" name="myName" placeholder="Your name..">
  <input type="file" name="myFile">
</form>

  <input type="button" value="Upload File" 
       onclick="this.value='Uploading..';
                var theForm = document.getElementById('myForm');
                google.script.run.withSuccessHandler(fileUploaded)
                .processFormData(theForm);">

<div id="output"></div>

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

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

服务器.gs

function processFormData(form) {
  uploadFiles(form.myFile);//Call first function to process the file

  var innerArray = [];
  var outerArray = [];

  innerArray.push(form.myName);
  innerArray.push(form.myFile);

  outerArray.push(innerArray);//Call second function to write data to SS
  writeDataToSS(outerArray);
};

function uploadFiles(theFile) {

  try {

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

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

    var blob = theFile;    
    var file = folder.createFile(blob);    
    file.setDescription("Uploaded by " + theFile);

    return "File uploaded successfully " + file.getUrl();

  } catch (error) {

    return error.toString();
  }
}

function writeDataToSS(values) {
  //html.setSandboxMode(HtmlService.SandboxMode.EMULATED);
  var url="url...";
  var message = 'Ram';
  var submitSSKey = '...kHI';
  var sheet = SpreadsheetApp.openById(submitSSKey).getActiveSheet();
  var lastRow = sheet.getLastRow();
  var targetRange = sheet.getRange(lastRow+1, 1, 1, 2).setValues(values);
}

html 文件不是模板,其中没有 scriptlet。只需使用createHtmlOutputFromFile():

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

关于javascript - HTML 表单不使用 doPost 提交到电子表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098109/

相关文章:

php - fatal error :未捕获的 ArgumentCountError:函数 Admincategory::deletecategory() 的参数太少,

javascript - 有没有办法从脚本中排除未明确与用户共享的文件? (也就是通过链接与域中的每个人共享的文件)

javascript - 发送电子邮件正确的触发设置

javascript - 如何单独用jQuery解析xml属性?

java - 如何用Jsoup只获取n层元素?

javascript - 了解angular2中的依赖注入(inject)

javascript - 如何为 div 中的子图像元素触发 onClick 事件

google-apps-script - Google 电子表格中的时区转换

javascript - jQuery,动态追加元素时增加id号

javascript - 重新选择并上传相同的文件