如何检查列 header 是否存在,如果不存在则添加 header 列 - Google Sheet Apps 脚本
How to check if column header exists and if not add header column - Google Sheet Apps Script
我使用以下代码将表单中的数据插入 google sheet。
它工作正常并正确添加数据。
问题是当我想将数据添加到不在我的工作中的列时 sheet。
我知道我必须检查工作中是否存在这样的列sheet。如果不存在,请添加它。然后才添加一行新数据。
不幸的是,我是 Apps Script 的新手,我不知道该怎么做
// In case you want to change the Sheet name
var sheetName = 'xyz'
var scriptProp = PropertiesService.getScriptProperties()
// Lowercasing all input keys in the POST data by default (to avoid Message vs message confusion)
var shouldLowerCaseHeaders = true
function intialSetup () {
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
scriptProp.setProperty('key', activeSpreadsheet.getId())
}
function filterRow (parameters, mandatoryFields) {
return mandatoryFields.every(field => parameters[field.toString().toLowerCase()] && parameters[field.toString().toLowerCase()].length > 0)
}
function doPost (e) {
var lock = LockService.getScriptLock()
lock.tryLock(10000)
// Uncomment and add fields which must be mandatory when submitting a form
//const mandatoryFields = ['questions']
const mandatoryFields = []
try {
// Get the current open Google Sheet
var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
var sheet = doc.getSheetByName(sheetName)
// IMPORTANT: Create headers in your google sheet first
// If you dont create headers this won't match the data
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var parameters = e.parameter;
// Lower casing header keys - True by default
if (shouldLowerCaseHeaders){
Object.entries(e.parameter).map(([key, value]) => parameters[key.toString().toLocaleLowerCase()] = value)
}
const shouldInsertToSheet = filterRow(parameters, mandatoryFields)
if (shouldInsertToSheet){
var newRow = headers.map(function(header) {
return header.toString().toLowerCase() === 'timestamp' ? new Date() : parameters[header.toString().toLowerCase()]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
}
return HtmlService.createHtmlOutput("post request received");
}
catch (e) {
return HtmlService.createHtmlOutput("post request received");
}
finally {
lock.releaseLock()
}
}
如何检查第 header 列是否存在,如果不存在则添加 header 列?
如果你想添加一个 header 不包含在初始值中,只需将你已有的与新列表进行比较,如果不包含任何属于新列表的,将它们添加到 header 的末尾。
假设您 table 的 header 是这些:
Header1
Header2
Header3
Header4
Code.gs
const sS = SpreadsheetApp.getActiveSheet()
function appendHeaderIfNotExist(headersResponse) {
const actualHeaders = sS.getRange(1, 1, 1, sS.getLastColumn()).getValues().flat()
headersResponse.forEach(h => {
if (!actualHeaders.includes(h)) sS.getRange(1, sS.getLastColumn() + 1).setValue(h)
})
}
function testImplementation() {
appendHeader(['Header1', 'Header5'])
}
在 运行 函数之后 appendHeaderIfNotExist
:
Header1
Header2
Header3
Header4
Header 5
您必须调整它以在您的脚本中工作,可能是通过解析响应的内容并使用响应的键数组调用函数。
我使用以下代码将表单中的数据插入 google sheet。 它工作正常并正确添加数据。 问题是当我想将数据添加到不在我的工作中的列时 sheet。 我知道我必须检查工作中是否存在这样的列sheet。如果不存在,请添加它。然后才添加一行新数据。 不幸的是,我是 Apps Script 的新手,我不知道该怎么做
// In case you want to change the Sheet name
var sheetName = 'xyz'
var scriptProp = PropertiesService.getScriptProperties()
// Lowercasing all input keys in the POST data by default (to avoid Message vs message confusion)
var shouldLowerCaseHeaders = true
function intialSetup () {
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
scriptProp.setProperty('key', activeSpreadsheet.getId())
}
function filterRow (parameters, mandatoryFields) {
return mandatoryFields.every(field => parameters[field.toString().toLowerCase()] && parameters[field.toString().toLowerCase()].length > 0)
}
function doPost (e) {
var lock = LockService.getScriptLock()
lock.tryLock(10000)
// Uncomment and add fields which must be mandatory when submitting a form
//const mandatoryFields = ['questions']
const mandatoryFields = []
try {
// Get the current open Google Sheet
var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
var sheet = doc.getSheetByName(sheetName)
// IMPORTANT: Create headers in your google sheet first
// If you dont create headers this won't match the data
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var parameters = e.parameter;
// Lower casing header keys - True by default
if (shouldLowerCaseHeaders){
Object.entries(e.parameter).map(([key, value]) => parameters[key.toString().toLocaleLowerCase()] = value)
}
const shouldInsertToSheet = filterRow(parameters, mandatoryFields)
if (shouldInsertToSheet){
var newRow = headers.map(function(header) {
return header.toString().toLowerCase() === 'timestamp' ? new Date() : parameters[header.toString().toLowerCase()]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
}
return HtmlService.createHtmlOutput("post request received");
}
catch (e) {
return HtmlService.createHtmlOutput("post request received");
}
finally {
lock.releaseLock()
}
}
如何检查第 header 列是否存在,如果不存在则添加 header 列?
如果你想添加一个 header 不包含在初始值中,只需将你已有的与新列表进行比较,如果不包含任何属于新列表的,将它们添加到 header 的末尾。
假设您 table 的 header 是这些:
Header1 | Header2 | Header3 | Header4 |
---|
Code.gs
const sS = SpreadsheetApp.getActiveSheet()
function appendHeaderIfNotExist(headersResponse) {
const actualHeaders = sS.getRange(1, 1, 1, sS.getLastColumn()).getValues().flat()
headersResponse.forEach(h => {
if (!actualHeaders.includes(h)) sS.getRange(1, sS.getLastColumn() + 1).setValue(h)
})
}
function testImplementation() {
appendHeader(['Header1', 'Header5'])
}
在 运行 函数之后 appendHeaderIfNotExist
:
Header1 | Header2 | Header3 | Header4 | Header 5 |
---|
您必须调整它以在您的脚本中工作,可能是通过解析响应的内容并使用响应的键数组调用函数。