Google Apps脚本HTML服务中的HTML5表单验证和文件上载

时间:2014-12-16 08:58:45

标签: jquery html5 validation google-apps-script

我正在使用HTML服务开发GAS,现在遇到了障碍。我试图做的是

  1. 创建一个可以将表格元素(即姓名和电子邮件)中的数据添加到Google表格
  2. 的内容
  3. 表单还会将文件上传到特定的Google驱动器
  4. 在1和2之前,表单应根据HTML5验证输入
  5. 这是我的(差不多)工作代码:

    Code.gs

    function doGet(e) {
        return HtmlService.createHtmlOutputFromFile('index.html');
    }
    
    function uploadFiles(form) {
        try {
        var ssID = '-------ssID-------';
        var dropboxID = '-------DriveID-------';
        var folder = DocsList.getFolderById(dropboxID);
    
        var blob = form.myFile;    
    
        if ( Boolean(blob) ) {
            var file = folder.createFile(blob);
            file.setDescription("Uploaded by " + form.myName);
        }
    
    var sheet = SpreadsheetApp.openById(ssID).getSheets()[0];
    var lastRow = sheet.getLastRow();
    var targetRange = sheet.getRange(lastRow+1, 1, 1, 3).setValues([[ form.myName, form.myMail, file.getUrl() ]]);
    return "File uploaded successfully"+ file.getUrl() + file.getName();
    
        } catch (error) {
            return error.name + ' on line: ' + error.lineNumber + ' -> ' + error.message;
        }
    }
    

    的index.html

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <!-- You can also include your own CSS styles -->
    <style>
        form { margin: 40px auto; }
        input { display:block; margin: 20px; }
    </style>
    
    <!-- This is the actual HTML form -->
    <!--form id="myForm" onsubmit="runGAS(this)"-->
    <form id="myForm" onsubmit="return google.script.run
        .withSuccessHandler(fileUploaded)
        .uploadFiles(this.parentNode);">
    
        <!-- Text input fields -->
        <input type="text" name="myName" id="myName" placeholder="Your name.." required />
        <input type="email" name="myMail" id="myMail" placeholder="Your mail.." required />
        <!-- File input filed -->
        <input type="file" name="myFile" id="myFile" required />
        <!-- The submit button. It calls the server side function uploadfiles() on click -->
        <input type="submit" value="run onClick" 
               onclick="this.value='Uploading..';
                        google.script.run.withSuccessHandler(fileUploaded)
                        .uploadFiles(this.parentNode);
                        return false;">
        <input type="submit" value="Run GAS Function">
    </form>
    <script>
    
    function runGAS( argThis ) {
        var n = $( "#myName" ).val();
        var f = document.getElementById("myFile");
        // var g = $( "myFile" ).val();
        if( Boolean(n) ) {
            document.getElementById('output').innerHTML = "OK" + n + "js: " + f;
            google.script.run.withSuccessHandler(fileUploaded)
            .uploadFiles( argThis );
            document.getElementById('output').innerHTML = e.name + 'on line:' + e.lineNumber + '->' + e.message;
        }
        return false;
    }
    
    </script>
    
    <!-- Here the results of the form submission will be displayed -->
    <div id="output"></div>
    
    <!-- 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>
    

    我发现了许多建议:

    1. 许多不会处理文件上传的教程(只有Sheet)会直接从提交按钮调用,这绕过了HTML5验证。这是我的第一个提交按钮名称的示例&#34;运行onClick。&#34;
    2. 搜索后,我发现要触发HTML5验证(这里是链接HTML5 form validation with Html Service),另一个提交按钮的情况标题为&#34;运行onClick,&#34;我们应该将GAS函数调用移动到form元素,这样做有助于触发HTML5验证,但是 GAS会发生奇怪的事情,因为它赢了,而URL生成典型的{{1表单值(例如,GET
    3. 另一个解决方案,一些建议我们可以使用jQuery来捕获表单提交以仅在满足所有要求(验证)时触发GAS函数调用。这给我的结果与2.相同。 GAS运行,但返回此页面时未传递任何实际值。
    4. 任何解决方案都将受到赞赏。

      2014年12月19日编辑

      https://script.google.com/a/macros/----/s/---------/dev?myName=va&myMail=vas%40au.edu&myFile=imgName.jpg

      我尝试了Sandy建议的内容,省略了表单元素中函数调用<script> window.runGAS = function() { // jQuery Style window.form = $( "#myForm" ); // OR JS window.form = document.getElementById('myForm'); google.script.run .withSuccessHandler(fileUploaded) .uploadFiles(form); return false; } </script> 中的传递值。这有助于解雇HTML5验证。我想我必须找到将表单对象(而不是单个表单值)传递给onsubmit的方法,所以我通过GAS函数运行传递表单对象。

      如果我使用jQuery样式,JavaScript控制台会报告code.gs

      如果我使用Untaming of guest constructed objects unsupported: [object Object],我会遇到同样的问题,它会生成带有name = value对的GET样式URL,并返回到index.html,而不会执行&#34;执行&#34; getElementById功能。注意它&#34;似乎&#34;以某种方式通过code.gs(例如,如果我发出一些语法错误,它将在此过程中报告)但它不会像在code.gs那样做它应该做的事情。

      到目前为止,唯一可行的方法是使用onclick,而不是onclick,而不是从代码中调用中间GAS。但它绕过了HTML5验证。

      我真的不知道这里......

1 个答案:

答案 0 :(得分:0)

以下是我使用HTML服务配置FORM的方法:

<form id="myInputForm" name="input" onsubmit="writeInput()">

我没有在表单中运行onsubmit="return google.script.run。我想我遇到了你遇到的相同或类似的问题。因此,表单在提交表单时运行JavaScript函数writeInput()。然后SCRIPT标记中的JavaScript函数运行google.script.run。这对我有用。当我以这种方式进行设置时,输入具有 required 设置的字段将使表单无法提交。

<script>
  window.writeInput = function() {
    window.myInputValue = document.getElementById('idMyInputID').value; //Get input value
    google.script.run
  }
<script>

您应该在前端和后端的 上进行数据验证。黑客可能能够找到一些方法将自己的数据发送到.gs服务器端代码。如果我在前端,客户端或后端,服务器端选择 验证,我将进行服务器端验证。至于如果他们的数据输入错误将msg快速返回给用户,客户端检查更好,但它不是更安全。

你真的在问一个关于个人偏好或意见问题的问题。我只是在HTML中使用JavaScript来从输入字段中获取值。

window.variableName = document.getElementById('id_Name').value;

该行代码从表单输入字段中获取值,并将其转换为变量。然后,您可以将变量发送到.gs文件。

google.script.run.withFailureHandler(onFailure)
      .withSuccessHandler(savedLst)
      .writeInputData(variableName);

上面的代码在HTML中。函数writeInputData位于.gs脚本文件中。

在调用variableName函数之前,您可以检查变量writeInputData以进行验证。

if (variableName === "") {
  alert("Missing Input");
  return false;
} else {
  google.script.run.withFailureHandler(onFailure)
    .withSuccessHandler(savedLst)
    .writeInputData(variableName);
};

还有其他方法可以进行前端数据验证。您可以组合方法。如果您发现无法修复的错误,请发布错误消息及其来源。

要从HTML中打印信息,请使用:console.log("some text here: " + variableName);这将在浏览器的控制台上打印一些内容。打开开发人员工具和控制台,查看打印到浏览器控制台的内容。不要与Logger.log()混淆,后者将某些内容打印到服务器端的Apps脚本日志。