Google Apps Script表单复制脚本如何用.trim()去除首尾空白
问题背景
我在Google表格中编写了Apps Script脚本,实现两个核心功能:
- 表单提交时自动将「Form Responses(表单回复)」工作表的提交行复制到「Working」工作表
- 勾选复选框时触发跨表移动行的配套功能
使用中发现,若表单提交的内容首尾存在误输入的多余空白字符,会导致后续关联功能运行异常。已知.trim()方法可以去除字符串首尾空白,需要将该逻辑集成到现有脚本中。

现有完整代码
表单提交相关代码
function getNextIndexA() { var sheetTo = SpreadsheetApp.getActive().getSheetByName("Working"); var myValues = sheetTo.getRange('A:A').getValues(); var i; for (i=0; i<myValues.length; i++) { if (myValues[i][0] === '') return i+1; } return i+1; } function onFormSubmit(event){ var ss = event.source; var s = ss.getSheetByName('Form Responses'); var r = event.source.getActiveRange(); var row = r.getRow(); var numColumns = 7; var pageSheet = ss.getSheetByName('Working'); var target = pageSheet.getRange(getNextIndexA(), 1, 1, 7); s.getRange(row, 2, 1, numColumns).copyTo(target, { contentsOnly: true }); }
复选框跨表移动相关代码
function onEdit(e) { moveRowByCheckboxToSomeSheet_(e); } function moveRowByCheckboxToSomeSheet_(e) { const numColumnsToMove = 8; let sheet; if (e.value !== 'TRUE' || e.range.columnStart !== 10 || !(sheet = e.range.getSheet()).getName().match(/^(Working)$/i)) { return; } e.range.setValue(false); const targetSheetName = e.range.offset(0, -1).getDisplayValue(); const targetSheet = e.source.getSheetByName(targetSheetName); var response = SpreadsheetApp.getUi().alert("ㅤㅤ⚠️ㅤATTENTIONㅤ⚠️", "ㅤAre you sure you want to move this row?", SpreadsheetApp.getUi().ButtonSet.YES_NO); if (response !== SpreadsheetApp.getUi().Button.YES) { return; } //findEmailAddress(); const rangeToMove = sheet.getRange(e.range.rowStart, 1, 1, numColumnsToMove); const values = rangeToMove.getValues(); appendRows_(targetSheet, values, 1); var nv = sheet.getRange(e.range.rowStart, 1, 1, numColumnsToMove + 2).setValue(null); } function appendRows_(sheet, data, optColumn) { if (!Array.isArray(data)) { data = [[data]]; } else if (!Array.isArray(data[0])) { data = [data]; } const rowStart = getLastRow_(sheet, optColumn) + 1; const columnStart = Number(optColumn) || 1; const numRows = data.length; const numColumns = data[0].length; const range = sheet.getRange(rowStart, columnStart, numRows, numColumns); range.setValues(data); return { range: range, rowStart: rowStart, columnStart: columnStart, numRows: numRows, numColumns: numColumns }; } function getLastRow_(sheet, columnNumber) { const values = columnNumber ? sheet.getRange(1, columnNumber, sheet.getLastRow() || 1, 1).getDisplayValues() : sheet.getDataRange().getDisplayValues(); for (var row = values.length - 1; row >= 0; row--) { if (values[row].join('')) { break; } } return row + 1; }
修改方案
只需要新增1个通用处理函数,修改2处值写入的入口逻辑即可,其余原有代码保持不变,不会影响现有功能的触发规则。
- 新增通用去空白工具函数,放在代码任意位置(建议放在脚本最顶部方便维护):
/** * 批量处理表格二维数组,去除所有字符串类型值的首尾空白 * 非字符串类型(数字、日期、布尔值、空值)保持原有内容不变 */ function trimSheetValues(data) { return data.map(row => row.map(cell => typeof cell === 'string' ? cell.trim() : cell) ) }
- 修改
onFormSubmit函数,替换原有直接复制的逻辑,改为读取值后先去空白再写入:
function onFormSubmit(event){ var ss = event.source; var s = ss.getSheetByName('Form Responses'); var r = event.source.getActiveRange(); var row = r.getRow(); var numColumns = 7; var pageSheet = ss.getSheetByName('Working'); var targetRow = getNextIndexA(); var targetRange = pageSheet.getRange(targetRow, 1, 1, numColumns); // 读取源行数据 -> 去首尾空白 -> 写入目标表 var sourceData = s.getRange(row, 2, 1, numColumns).getValues(); targetRange.setValues(trimSheetValues(sourceData)); }
- 修改
appendRows_公共写入函数,在所有跨表移动行的写入操作前统一做去空白处理,覆盖复选框移动行的所有场景:
function appendRows_(sheet, data, optColumn) { if (!Array.isArray(data)) { data = [[data]]; } else if (!Array.isArray(data[0])) { data = [data]; } // 写入前统一处理空白字符 data = trimSheetValues(data); const rowStart = getLastRow_(sheet, optColumn) + 1; const columnStart = Number(optColumn) || 1; const numRows = data.length; const numColumns = data[0].length; const range = sheet.getRange(rowStart, columnStart, numRows, numColumns); range.setValues(data); return { range: range, rowStart: rowStart, columnStart: columnStart, numRows: numRows, numColumns: numColumns }; }
修改说明:该方案会自动跳过数字、日期、布尔值等非字符串类型的单元格内容,不会误改原有格式,仅对用户输入的文本内容做首尾空白清理。
内容的提问来源于stack exchange,提问作者Jon Beckner
相关产品推荐
相关产品推荐

