0

我在提交表单时收到错误 400,但数据已按预期传输到我的 Google 表格。

我已经阅读了可能导致 400 错误的原因,但我的理解还不够先进,无法发现代码中的错误。

代码.gs

function doGet() {
  return HtmlService
      .createTemplateFromFile('jSignature')
      .evaluate();
}

function saveImage(bytes, sign){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('FormResponse');
  var dateObj = Date.now();
  var bytes = bytes.split(",")
  var blob = Utilities.newBlob(Utilities.base64Decode(bytes[1]), 'image/png');
  var fileName = blob.setName("Signature "+dateObj).getName();
  var sigFolder = DriveApp.getFolderById("myFolder"); //replace with your folder id
  var url = sigFolder.createFile(blob).getId();
  Logger.log(url)
  var carrier = sign.carrier;
  var address = sign.address;
  var dname = sign.dname;
  var dnum = sign.dnum;
  var date = sign.date;
  var time = sign.time;
  var tractortruck = sign.tractortruck;
  var odom = sign.odom;
  var imageCell = ss.getRange(ss.getLastRow()+1, 1, 1, 9).setValues([[carrier, address, dname, dnum, date, time, tractortruck, odom, url]]);
}

html

<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=2, maximum-scale=1, user-scalable=0"/></head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/willowsystems/jSignature/master/libs/jSignature.min.js"></script>
<style>
</style>
<body>
<center><h1><big><big>DRIVER VEHICLE INSPECTION REPORT</big></big></h1>
<h5>AS REQUIRED BY THE D.O.T. FEDERAL MOTOR CARRIER SAFETY REGULATIONS</h5></center><br>
<form id="customerForm" action="/action_page.php">
<div class="container">
  <label for="carrier">Carrier:</label>
    <select id="carrier" name="carrier" required>
      <option value="My Company">My Company</option>   
      </select><br>
    Location:
  <table id= "Address">
  <tr>
  <td>PDX</td>
  <td>EUG</td>
  <td>SEA</td>
  <td>SFO</td>
  </tr>
  <tr>
  <td><input type="radio" id="PDX" oninput="this.className = '';EUG.className = '';SEA.className = '';SFO.className = ''" name="Address" value="PDX"></td>

  <td><input type="radio" id="EUG" oninput="this.className = '';PDX.className = '';SEA.className = '';SFO.className = ''" name="Address" value="EUG"></td>

  <td><input type="radio" id="SEA" oninput="this.className = '';EUG.className = '';PDX.className = '';SFO.className = ''" name="Address" value="SEA"></td>

  <td><input type="radio" id="SFO" oninput="this.className = '';EUG.className = '';SEA.className = '';PDX.className = ''" name="Address" value="SFO"></td>
  </tr>
  </table>
      <label for="Driver name">Driver Performing Inspection:</label>
  <input type="text" id="dname" name="drivername" placeholder="Your full name" required><br>
  <label for="Driver Employee ID number">Driver's Employee Number:</label><br>
  <input type="number" id="dnum" name="drivernumber" placeholder="Your employee number" required><br><br>
  <label for="Date">Date Performed:</label><br>
  <input type="date" id="date" name="date" required><br><br>
  <label for="Time">Time Performed:</label><br>
  <input type="time" id="time" name="time" value="now" required><br><br>
  <label for="Tractor/Truck#">Tractor / Truck #:</label><br>
  <input type="number" id="tractor/truck" name="tractortrucknum" placeholder="Your vehicle number" required><br><br>
  <label for="Odometer">Odometer Reading:</label><br>
  <input type="number" id="odom" name="odometer" placeholder="Vehicle odometer reading" required><br><br>
<b><big>Signature:</big></b>
<div id="signature"></div><br>
<img id="rendered" src="" style="display:none">
<input type="submit" value="Submit and close" onclick="renderSignature();saveImage();"/>
</div>
</form>
</body>
<script>

  $("#signature").jSignature({
    'background-color': 'transparent',
    'decor-color': 'transparent',
  });

  function renderSignature(){
    $("img#rendered").attr("src",$('#signature').jSignature('getData','default'));
  }

    function saveImage(e){ //This sends the image src to saveImages function
    var bytes = document.getElementById('rendered').src;
    console.log(bytes);
    var sign = {
      carrier: document.getElementsByName('carrier')[0].value,
      address: $('input[name="Address"]:checked').val(),
      dname: document.getElementsByName('drivername')[0].value,
      dnum: document.getElementsByName('drivernumber')[0].value,
      date: document.getElementsByName('date')[0].value,
      time: document.getElementsByName('time')[0].value,
      tractortruck: document.getElementsByName('tractortrucknum')[0].value,
      odom: document.getElementsByName('odometer')[0].value,
    };
    alert("saveImage successful");
    google.script.run.saveImage(bytes, sign);
    return
  }

let date = new Date().toISOString().substr(0, 10);
document.querySelector("#date").value = date;

$(function(){     
  var d = new Date(),        
      h = d.getHours(),
      m = d.getMinutes();
  if(h < 10) h = '0' + h; 
  if(m < 10) m = '0' + m; 
  $('input[type="time"][value="now"]').each(function(){ 
    $(this).attr({'value': h + ':' + m});
  });
});
</script>
</html>

理想情况下,我希望看到表单将用户带到提交时的 URL。我想一旦我们解决了 400 问题,我就可以解决这个问题。不过,如果有人有建议,我很想听听。

4

3 回答 3

0

这可能看起来很愚蠢,但似乎我没有使用 /action_page.php 来收集数据,这一切都是在 JS 中通过函数 saveImage 和 renderSignature 完成的。查看旧版本的代码时,我意识到它没有使用 /action_page.php。所以这一定是我在尝试改进代码的过程中学到的东西,但这似乎是不必要的。删除后,我的所有信息都会被保存并完全按照我的需要转移到谷歌工作表中,并且我在提交时没有收到 400 错误。

谢谢大家的帮助!我希望这可以帮助别人。

于 2019-10-09T18:53:27.560 回答
0

最有可能的

  • 脚本绑定到的电子表格'FormResponse'中不存在该工作表
  • DriveApp.getFolderById()不包含有效的文件夹 ID
  • 或者您无权访问此文件夹
于 2019-10-09T12:47:07.177 回答
0

我不能直接代表谷歌表格,但我怀疑你的代码没问题。

阅读以下内容:Google 表格:常见返回的错误

即这个:

错误:Google 返回状态码 400: Google 表格错误 400 通常表示集成中使用的凭据无效。尝试删除并重新添加集成,如果凭据已针对所使用的 Google 表格帐户进行了更改,请更新凭据。如果能够重新添加而不会出现错误,那应该可以解决任何无效的访问错误,您可以在现有提交上重新运行集成。如果您最近更改了电子表格,则此错误也可能是“受保护的工作表和范围”的问题。如果 Google 表格返回错误请求 - “无法检索单元格”错误,这是因为您的表格的第一行中没有列标签。

我只能假设您提交数据然后立即查询。

服务器很有可能没有处理/存储您当前尝试访问的数据。

如果您最近更改了电子表格,则此错误也可能是“受保护的工作表和范围”的问题。

该解决方案将是不复杂的,并且将涉及以下两件事之一:

  1. try / catch阻止尝试查询站点/数据&如果返回错误,只需处理没有任何数据的页面
  2. 等待 1 秒再try / catch查询。如果错误 - 等待 2 秒然后try / catch查询。重复增加持续时间直到 5 秒,然后如果在 5 次查询后无法检索到数据,则只加载没有任何数据的页面。


但是,最好仔细检查这些与您的电子表格/代码组合是否正确(我们无权访问您的电子表格):


希望这会有所帮助,我之前在 Sharepoint 在线查询中遇到过类似的问题。

于 2019-10-08T23:17:08.407 回答