如何实现谷歌扩展中textarea多行内容拆分写入Google Sheet不同行?
问题:谷歌扩展向Google Sheet发送多行内容到不同行的实现
尝试从谷歌扩展向Google Sheet发送数据时遇到问题(截图显示相关操作报错)。希望在textarea中输入多行内容后,Google Sheet能将这些内容分别存入不同行,请问是否可行?
以下是当前使用的代码:
HTML代码
<form method="POST" action="my script url"> <label style="font-size:20px;color: green;">Auto </label> <textarea name="Auto" type="text" id="autolist"></textarea> <button type="submit" class="button-38" role="button" id="addauto">Add to Auto</button><br><br> </form>
Google Script代码
const sheetName = 'Sheet1' const scriptProp = PropertiesService.getScriptProperties() function intialSetup () { const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { const lock = LockService.getScriptLock() lock.tryLock(10000) try { const doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) const sheet = doc.getSheetByName(sheetName) const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] const nextRow = sheet.getLastRow() + 1 const newRow = headers.map(function(header) { return header === 'Date' ? 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() } }
解决方案:实现多行内容分存入Sheet不同行
完全可行,只需修改Google Script中的doPost函数,将textarea的多行内容按换行符分割后逐行写入Sheet:
const sheetName = 'Sheet1' const scriptProp = PropertiesService.getScriptProperties() function intialSetup () { const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { const lock = LockService.getScriptLock() lock.tryLock(10000) try { const doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) const sheet = doc.getSheetByName(sheetName) const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] const nextRow = sheet.getLastRow() + 1 // 获取textarea内容并按换行分割,过滤空行 const autoContent = e.parameter.Auto || '' const lines = autoContent.split(/\r?\n/).filter(line => line.trim() !== '') // 生成每行对应的Sheet数据 const rows = lines.map(line => { return headers.map(header => { return header === 'Date' ? new Date() : line }) }) // 批量写入Sheet if (rows.length > 0) { sheet.getRange(nextRow, 1, rows.length, rows[0].length).setValues(rows) } return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'rowsAdded': rows.length })) .setMimeType(ContentService.MimeType.JSON) } catch (e) { return ContentService .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e })) .setMimeType(ContentService.MimeType.JSON) } finally { lock.releaseLock() } }
关键修改说明:
- 兼容换行格式:用
split(/\r?\n/)分割内容,适配Windows(\r\n)和Unix(\n)的换行格式 - 过滤无效空行:通过
filter去掉纯空白的行,避免Sheet中出现空数据行 - 批量写入提升效率:一次性写入所有行数据,比逐行写入更高效,减少API调用次数
内容的提问来源于stack exchange,提问作者34UR
相关产品推荐
相关产品推荐

