Javascript 谷歌表单没有收到提交的表单

Javascript 谷歌表单没有收到提交的表单,javascript,google-apps-script,google-sheets,google-apps,Javascript,Google Apps Script,Google Sheets,Google Apps,我创建了该表: 从脚本编辑器中,我创建了以下表单: 代码.gs function doGet() { return HtmlService.createTemplateFromFile('Form.html') .evaluate() // evaluate MUST come before setting the Sandbox mode .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOW

我创建了该表:

从脚本编辑器中,我创建了以下表单:

代码.gs

function doGet() {
    return HtmlService.createTemplateFromFile('Form.html')
        .evaluate() // evaluate MUST come before setting the Sandbox mode
        .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}


var sheetName = 'Sheet1'
var scriptProp = PropertiesService.getScriptProperties()


function doPost (e) {
  var lock = LockService.getScriptLock()
  lock.tryLock(10000)

  try {
    var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
    var sheet = doc.getSheetByName(sheetName)

    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
    var nextRow = sheet.getLastRow() + 1

    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    })

    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])

    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  finally {
    lock.releaseLock()
  }
}

Form.html

<!DOCTYPE html>
<html>
<body>
<style>
</style>

<form name="submit-to-google-sheet" id="form" method="POST" onsubmit="myFunction()">
<input name="TEXT" type="text" placeholder="text" required>
  <input type="submit" value="Submit" name="submit" id="Submit">
</form>

<script>
function myFunction() {
  alert("The form was submitted. Please press okay to reload the page");
}
</script>

<script>
  const scriptURL = 'https://script.google.com/macros/s/AKfycbxdtFz3L5Zczor9v-CGvm1yLzTogasSF__22oadV80ZFMQFH18/exec'
  const form = document.forms['submit-to-google-sheet']
  form.addEventListener('submit', e => {
    e.preventDefault()
    window.open("URL after form submit", "_top")
    fetch(scriptURL, { method: 'POST', body: new FormData(form)})
      .then(response => console.log('Success!', response))
      .catch(error => console.error('Error!', error.message))
  })
</script>

</body>
</html>

函数myFunction(){
警报(“表单已提交。请按“确定”重新加载页面”);
}
常量脚本URL=https://script.google.com/macros/s/AKfycbxdtFz3L5Zczor9v-CGvm1yLzTogasSF__22oadV80ZFMQFH18/exec'
const form=document.forms['submit-to-google-sheet']
form.addEventListener('submit',e=>{
e、 预防默认值()
打开(“表单提交后的URL”,“顶部”)
fetch(scriptURL,{method:'POST',body:newformdata(form)})
.then(response=>console.log('Success!',response))
.catch(error=>console.error('error!',error.message))
})
相同的代码在另一个工作表中对我有效,但当我出于某种原因尝试在此工作表中重复时,表单未提交到工作表。有什么帮助吗?请您以正确的方式给出指示,将相同的代码复制到其他工作表。因此,当我创建另一个具有不同列的工作表并将相同的代码粘贴到脚本编辑器时,需要做什么才能使脚本适用于新工作表,等等。谢谢

您需要更改以下内容:
  • 当您将脚本复制到另一个电子表格并将其发布为WebApp时-
    scriptURL
    将要更改-请使用新的进行更新

  • var doc=SpreadsheetApp.openById(scriptProp.getProperty('key'))
    只有在为新脚本设置属性
    key
    时才会起作用。作为解决方法,只需将此行替换为
    var doc=SpreadsheetApp.getActive()-这将使脚本自动找到它绑定到的电子表格

  • 好的,解决办法是

    保留问题中的原始脚本,并进行以下修改:

    从html中删除此部分:

    <script> const scriptURL = 'Script URL' const form = document.forms['submit-to-google-sheet'] form.addEventListener('submit', e => { e.preventDefault() window.open("URL 
    after form submit", "_top") fetch ... </script>
    
    constscripturl='scriptURL'constform=document.forms['submit-to-google-sheet']form.addEventListener('submit',e=>{e.preventDefault()window.open('URL
    在表单提交“,”_top“)获取之后。。。
    
    并在此处添加脚本URL:

    <form name="submit-to-google-sheet" id="form" action="Script URL" method="POST" 
    onsubmit="myFunction()">
    
    
    
    及作改道用途;; 替换此项:

    <script>
    function myFunction() {
    alert("The form was submitted. Please press okay to reload the page");
    }
    </script>
    
    
    函数myFunction(){
    警报(“表单已提交。请按“确定”重新加载页面”);
    }
    

    function myFunction(){alert(“表单已提交。请按OK重新加载页面”);窗口。打开(“https://www.example.com“,“_top”);}
    

    感谢所有朋友的帮助。

    在您的目标中,您希望使用复制的电子表格中的脚本将表单中的值放在哪里?愚蠢的问题,您是否发布/部署了脚本?此外,如果您只想将web应用程序中的值保存回工作表,为什么不直接使用
    script.google.run
    发送将数据返回GAS以添加到工作表中?感谢您对ziganotschka的兴趣。我将ScriptURL更新为新的,并将属性键替换为getActive,但仍然没有将数据发送到工作表中。有什么想法吗?我在您的电子表格上测试了它,它对我有效。您是否在将更改作为新项目v实施后发布了脚本版本?您是否使用新的URL打开表单?此外,在发布之前,您需要手动运行脚本一次(即使出现错误)-为了启动授权流。我尝试了链接中的脚本,但无法找到将code.gs与form.html链接的方法。您能提供建议吗?您提供的链接中的脚本在
    doGet()
    函数中缺少
    return HtmlService.createTemplateFromFile('form.html')。evaluate()
    (而不是
    handleResponse(e)
    )-这是缺少的链接。相反,它包含函数
    setup()
    您需要手动运行它来设置
    。脚本的其余部分与您的脚本几乎相同。在实现我的答案中建议的更改并部署Web应用后,脚本应该可以工作,随后将Web应用部署为新版本。是的,现在它可以工作了,我尝试使用新的工作表也可以工作。我从html
    const scriptURL='Script URL'const form=document.forms['submit-to-google-sheet']form.addEventListener('submit',e=>{e.preventDefault()window.open(“表单提交后的URL”,“_top”)中删除了此部分获取…
    并在此处添加脚本URL
    表单在提交后将重定向到脚本URL。提交后我是否可以更改为其他URL。请告知
    <script> function myFunction() { alert("The form was submitted. Please press okay to reload the page"); window.open("https://www.example.com", "_top"); } </script>