如何验证与 Google Apps 脚本一起使用的脚本

问题描述 投票:0回答:1

我正在做一个项目,将以 HTML 表单收集的信息发送到 Google 电子表格。我找到了一个关于如何执行此操作的非常好的教程。这些是我正在使用的文件和脚本:

1。 HTML 文件

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="Google Sheet.css">
  </head>

  <body>
    <div class="container">
      <form method="post" action="URL of the Web App" name="contact-form">
        <h4>Contact Us</h4>
        <input type="text" name="your-name" placeholder="Name">
        <input type="text" name="your-number" placeholder="Number">
        <input type="email" name="your-email" placeholder="Email">
        <textarea name="message" rows="7" placeholder="Your Message"></textarea>
        <input type="submit" value="Submit" id="submit">
      </form>
    </div>
  </body>

  <script src="Google Sheet.js"></script>

</html>

2。 JS文件

const scriptURL = 'URL of the Web App'

const form = document.forms['contact-form']

form.addEventListener('submit', e => {
  
  e.preventDefault()
  
  fetch(scriptURL, { redirect: 'follow', method: 'POST', body: new FormData(form)})
  .then(response => alert("Thank you! Form is submitted" ))
  .then(() => { window.location.reload(); })
  .catch(error => console.error('Error!', error.message))
})

3. Google Apps 脚本中的脚本

const sheetName = ''
const scriptProp = PropertiesService.getScriptProperties()

function intialSetup () {
  const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  scriptProp.setProperty('key', activeSpreadsheet.getId())
}

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

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

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

    const newRow = headers.map(function(header) {
      return header === 'Date' ? 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()
  }
}

问题描述

如果我将应用程序部署为“谁有权访问”-->“任何人”,则一切正常。但我希望这个表格只能由我自己访问。

所以我将部署更改为“谁有权访问”-->“只有我”,并且脚本不起作用。

如果我删除 js 部分(处理错误并在成功时在屏幕上显示一个漂亮的窗口),我会再次工作。

所以我的猜测是我需要在获取中传递某种授权令牌。但我不知道如何或在哪里获得这个令牌。

javascript authentication google-apps-script web-applications
1个回答
0
投票

您应该将 OAuth2 与 google apps 脚本结合使用

  1. 为您的 Google Apps 脚本启用 OAuth2
  2. 获取 OAuth 令牌:
  3. OAuth2 流程

在 js 中实现 OAuth2 的示例

const token = ‘YOUR_OAUTH2_TOKEN’;
fetch(scriptURL, {
method: ‘POST’,
body: new FormData(form),
headers: {
‘Authorization’ : ‘Bearer’+ token 
}
})
.then(response => alert (“submitted”))
.then(() => {window.location.reload();})
.catch(error => console.error(‘Error’, error.message)
  1. 使用访问令牌
© www.soinside.com 2019 - 2024. All rights reserved.