我試圖擴展應用程序腳本的功能,根據兩列中的數據搜索條目行中的重復項,如果存在匹配項,則覆蓋現有行。
我知道我需要壹個for循環,循環遍歷Google Sheet中的每壹行,以與所討論的表單數據字段進行比較,但我不知道如何訪問每壹行。
這是表單的壹個縮短示例(實際要長得多):
<form id="form">
<form id="form">
<input name="firstName" placeholder="firstName" />
<input name="lastName" placeholder="lastName" />
<input name="someOtherField" placeholder="someOtherField" />
<input name="someFourthField" placeholder="someOtherField" />
<div class="btn-success btn" onclick="SaveData()">Save Data</div>
</form>
</form>
<script>
function SaveData() {
var formData = new FormData(document.getElementById("form"));
fetch('/macros/s/AKfycbwQFSXfeOKBHzf41MF6Nh5XIOjaPvr159-blUxsg5smD3BDH8qB4RUZRRo8q9nCJLb18w/exec',
{
method: 'post',
body: formData,
})
}
</script>
我的應用程序腳本在添加新行時運行良好,但我的for循環編寫不正確,因此找不到匹配項,或者設置nextRow索引不起作用:
var sheetName = 'Entries'
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]
})
var range = sheet.getDataRange();
var rangeData = range.getValues();
// Here is where the script is failing to find a match in the spreadsheet
for(i = 1; i > rangeData.length; i++) {
if(rangeData[i][0] == e.firstName && rangeData[i][1] == e.lastName)
{
nextRow = i;
}
}
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()
}
}
使用上述腳本,每個表單條目都會創建壹個新行,匹配永遠不會為true。所以我認為我在匹配查找中的邏輯或者我用來查找表單值和電子表格數據的語法有問題。那麽我錯過了什麽?
Thanks!
編輯:為了幫助詳細說明這個例子,我附上了壹個示例電子表格的截圖。按原樣,如果用戶提交了名為“Bob”和姓為“Belcher”的表單,我希望剩余的表單數據用這些名稱覆蓋現有行。但是如果firstName和lastName字段在電子表格中不匹配,請添加新行。
即使存在現有行,上述腳本也始終添加新行。我試圖使用這個問題中的邏輯來實現我想要的結果,但這導致腳本完全失敗(沒有更新的行和添加的行)。我還嘗試使用本視頻中概述的邏輯步驟,該步驟使用“indexOf”表單數據,而不是帶有if語句的for循環來查找匹配項。這個解決方案也不起作用