首页 > 解决方案 > 将选定的值推送到特定列

问题描述

我的 html 表单有几个字段,但是,我只希望将 id、Confirmation、Questions 和 Notes 发布到我工作表上各自的列中:

在此处输入图像描述

我怎样才能实现它?我只能根据与我的表单 name="" 值相同的标题名称将“所有”表单字段发布到他们的列中。

我只希望 id、Confirmation、Questions 和 Notes 映射到它们的右列。

我的代码.gs:

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 sheetName = e.parameter.svdate.split("/").splice(0, 2).map(function(e){return e.replace(/^0/, "")}).join("/");
    var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'));
    var sheet = doc.getSheetByName(sheetName);
    if (!sheet) throw new Error("Sheet Name was not found.");
    
    var headers = sheet.getRange(1, 1, 1, 10).getValues()[0]
    var nextRow = sheet.getLastRow() + 1
    
    var newRow = headers.map(function(header) {
      return header === 'timestamp' ? new Date() : e.parameter[header]
    })
    
    var find = sheet.getRange(1, 1, sheet.getLastRow()).createTextFinder(newRow[0]).matchEntireCell(true).findNext(); 
    sheet.getRange(find ? find.getRow() : nextRow, 1, 1, newRow.length).setValues([newRow]);
    
    return ContentService
    .createTextOutput(e.parameter.callback + "(" + JSON.stringify({ 'result': 'success', 'row': nextRow })+ ")")
    .setMimeType(ContentService.MimeType.JAVASCRIPT);
  }
  
  catch (e) {
    return ContentService
    .createTextOutput(e.parameter.callback + "(" + JSON.stringify({ 'result': 'error', 'error': e })+ ")")
    .setMimeType(ContentService.MimeType.JAVASCRIPT)
  }
  
  finally {
    lock.releaseLock()
  }
}

标签: google-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 提交 HTML 表单时,您只想将 的值放入id, Confirmation, Questions, and Notes电子表格。

在这种情况下,如何进行以下修改?

从:

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

至:

var keys = ["id", "confirmation", "questions", "notes"];
var newRow = headers.map(function (header) { return header === 'timestamp' ? new Date() : keys.includes(header.toLowerCase()) ? e.parameter[header] : "" });
  • 在此修改中,使用keys检索特定键的值。

参考:

添加:

从您的以下回复中,

你好田池。您建议的代码中有一个问题。它将其他列的值替换为 null,例如 Payment Method、LA Customer、Cleaners 等。

在这种情况下,请在您的问题中修改您的脚本,如下所示。

从:

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

var find = sheet.getRange(1, 1, sheet.getLastRow()).createTextFinder(newRow[0]).matchEntireCell(true).findNext(); 
sheet.getRange(find ? find.getRow() : nextRow, 1, 1, newRow.length).setValues([newRow]);

至:

var keys = ["id", "confirmation", "questions", "notes"];
var newRow = headers.map(function (header) { return header === 'timestamp' ? new Date() : ~keys.indexOf(header.toLowerCase()) ? e.parameter[header] : "" });

var find = sheet.getRange(1, 1, sheet.getLastRow()).createTextFinder(newRow[0]).matchEntireCell(true).findNext();
if (find) {
  var range = sheet.getRange(find.getRow(), 1, 1, newRow.length);
  var rowValue = range.getValues()[0].map(function(c, i) {return newRow[i] || c});
  range.setValues([rowValue]);
} else {
  sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);
}

推荐阅读