google-apps-script - 根据 ID 值更新 Google Sheet Row(我使用 Javascript 将有效负载插入到我的工作表中)
问题描述
我想用基于 ID 的新提交数据更新整行。我的页面上有一个表单,它使用 Javascript 将数据发送到我的工作表。
这是基于输入 ID 发送的简单脚本:
<script>
const scriptURL = "https://script.google.com/macros/s/AKfycxxxxxx/exec";
const form = document.forms['google-sheet']
form.addEventListener('submit', e => {
e.preventDefault()
fetch(scriptURL, { method: 'POST', body: new FormData(form)})
.then(response => document.getElementById("conf").submit() )
.catch(error => console.error('Error!', error.message))
})
</script>
这是我上网的应用程序脚本:
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(e.parameter.callback + "(" + JSON.stringify({ 'result': 'success', 'row': newRow })+ ")")
.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()
}
}
我能够在工作表上发布数据,但如果找到 ID,我想更新整行,如果找不到 ID,则插入:
解决方案
我相信你的目标如下。
- 提交表单时,您想
id
从“Sheet1”的“A”列中进行搜索。 - 当提交的 ID 存在于“Sheet1”的“A”列中时,您希望使用提交的值更新同一行。
- 当“Sheet1”的“A”列中不存在提交的 ID 时,您要附加提交的值。
在这种情况下,如何进行以下修改?
从:
var newRow = headers.map(function(header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
至:
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(); // Added
sheet.getRange(find ? find.getRow() : nextRow, 1, 1, newRow.length).setValues([newRow]); // Added
笔记:
- 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
- 您可以在“在不更改新 IDE 的 Web 应用程序 URL 的情况下重新部署 Web 应用程序”的报告中查看详细信息。
- 这个答案假设您当前的脚本工作正常。请注意这一点。
- 在您的情况下,我认为这
matchEntireCell(true)
可能适合TextFinder
. 所以我更新了上面的脚本。参考
参考:
推荐阅读
- azure - Azure Function App 中的路由或多个函数
- python - 如何使用 flask_sqlalchemy 从 MySQL 获取 varchar 类型的数据?
- python-3.x - slackAPI python在烧瓶中使用Jinja在父消息问题下传播消息回复
- cmd - wmic 密码中的用户逗号
- java - 绘制大量三角形的有效方法(OpenGL)
- iis - 无法使用 aspnet_regiis 导出密钥容器 iisCngWasKey
- asp.net-core - 在 ASP.Net Core 网站中使用 Microsoft 文档
- python-3.x - 在 kubernetes pod 中负载平衡 python webserver
- app-inventor - 在 MIT App Inventor 中将字符串转换为组件对象
- angular - 如何在 Angular 中为 HTTPClient get() 方法服务编写单元测试用例?