Google工作表脚本提交特定值

时间:2020-06-10 15:53:35

标签: google-sheets

我正在尝试将表单详细信息发送到工作的Google表格脚本。目前,以下代码可以完美地将表单字段提交给Google工作表。

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

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

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()
  }
}

但是我试图只提交一个特定的字段值,如果提交,则只提交一次。因此,如果它存在于Google工作表中,则会出错。我不知道。

这是JS

const scriptURL = 'HIDDEN'
const form = document.forms['submit-to-google-sheet']
const loading = document.querySelector('.js-loading')
const successMessage = document.querySelector('.js-success-message')
const errorMessage = document.querySelector('.js-error-message')

    form.addEventListener('submit', e => {
      e.preventDefault()
      showLoadingIndicator()
      fetch(scriptURL, { method: 'POST', body: new FormData(form)})
        .then(response => showSuccessMessage(response))
        .catch(error => showErrorMessage(error))
    })

    function showLoadingIndicator () {
      form.classList.add('is-hidden')
      loading.classList.remove('is-hidden')
    }

    function showSuccessMessage (response) {
      console.log('Submitted', response)
      setTimeout(() => {
        successMessage.classList.remove('is-hidden')
        loading.classList.add('is-hidden')
      }, 500)
    }

    function showErrorMessage (error) {
      console.error('Error!', error.message)
      setTimeout(() => {
        errorMessage.classList.remove('is-hidden')
        loading.classList.add('is-hidden')
      }, 500)
    }

这是HTML

<div class="form-container">
    <form name="submit-to-google-sheet">
      <input name="code" type="text" placeholder="Enter Code" required>
      <button type="submit">Submit</button>
    </form>

    <div class="loading js-loading is-hidden">
      <div class="loading-spinner">
        <svg><circle cx="25" cy="25" r="20" fill="none" stroke-width="2" stroke-miterlimit="10"/></svg>
      </div>
    </div>

    <p class="js-success-message is-hidden">You're not a winner, better luck next time.</p>
    <p class="js-error-message is-hidden">Error: Something wen't wrong, please try again later.</p>
  </div>

1 个答案:

答案 0 :(得分:0)

假设您要检查第2列中newRow[1]的内容是否重复:

  • 从B列中检索值,并使用flat()将它们转换为一维数组
  • 使用indexOf()验证newRow的内容是否已包含在B列中(如果数组中未包含值,indexOf()将返回-1 li>

出于测试目的将newRow[1]手动设置为123的示例:

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]
    })

    newRow[1] = 123;
    var columnTwo = sheet.getRange(1,2, sheet.getLastRow(), 1).getValues().flat();
    if (columnTwo.indexOf(newRow[1]) == - 1){
      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()
  }
}

更新

indexOf()仅适用于相同内容和数据类型的值。

如果电子表格的值是数字,但输入的过帐值是可识别的字符串,则需要将其转换为数字以进行正确比较。可以通过与 if (columnTwo.indexOf(Number(newRow[1])) == - 1){...