You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处值写入的入口逻辑即可,其余原有代码保持不变,不会影响现有功能的触发规则。

  1. 新增通用去空白工具函数,放在代码任意位置(建议放在脚本最顶部方便维护):
/**
 * 批量处理表格二维数组,去除所有字符串类型值的首尾空白
 * 非字符串类型(数字、日期、布尔值、空值)保持原有内容不变
 */
function trimSheetValues(data) {
  return data.map(row => 
    row.map(cell => typeof cell === 'string' ? cell.trim() : cell)
  )
}
  1. 修改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));
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:06:30