Google Sheets脚本问题:如何获取B14:O100多列数据写入另一表格?
问题解决:批量读取Google Sheets区域数据并写入另一表格
问题原因
你的代码中使用getValue()方法获取单元格范围数据时,该方法仅返回范围第一个单元格的值,因此每个列范围(如B14:B100)只会读取B14的值,最终只写入一行数据。要获取整个区域的所有数据,需使用getValues()方法,它会返回包含区域所有单元格值的二维数组。
修正后的代码
// @ts-nocheck function sendItem() { // 获取当前活动表格及InputForm工作表 var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet(); var shUserForm = myGoogleSheet.getSheetByName("InputForm"); // 连接目标表格及DATA工作表 SpreadsheetApp.enableAllDataSourcesExecution(); var myDataBarong = SpreadsheetApp.openById('1zwH6fMLG3N5eknt9lXqVwj8BJHTX-i9jTmXn_gZotTw'); var dataSheet = myDataBarong.getSheetByName("DATA"); // 读取InputForm中B14:O100的所有数据(二维数组,每个元素是一行数据) var formRange = shUserForm.getRange("B14:O100"); var formData = formRange.getValues(); // 读取固定值D10、当前时间、用户邮箱 var fixedValue = shUserForm.getRange("D10").getValue(); var currentDate = new Date(); var userEmail = Session.getActiveUser().getEmail(); // 处理数据:为每一行添加固定值、时间、邮箱字段,同时过滤空行 var processedData = formData.filter(row => row.some(cell => cell !== "")) .map(row => { row.push(fixedValue); row.push(currentDate); row.push(userEmail); return row; }); // 批量写入目标表格 if (processedData.length > 0) { var targetStartRow = dataSheet.getLastRow() + 1; dataSheet.getRange(targetStartRow, 1, processedData.length, processedData[0].length) .setValues(processedData); // 为时间列设置指定格式(对应新增的第2个字段,原B-O共14列,加3个字段后为第16列) dataSheet.getRange(targetStartRow, 16, processedData.length) .setNumberFormat('dd-mm-YYYY h:mm am/pm'); } // 可选:清空表单数据 // shUserForm.getRange("B14:O100").clearContent(); // SpreadsheetApp.getUi().alert('数据已记录!'); }
关键修改说明
- 替换取值方法:用
getValues()一次性读取B14:O100的所有行数据,替代原逐个列读取的低效方式,同时解决仅取第一行的问题。 - 过滤空行:通过
filter移除表单中的空行,避免写入无效数据。 - 批量写入:使用
setValues()一次性将所有处理后的数据写入目标表格,大幅提升脚本执行效率。 - 统一格式设置:单独对时间列设置显示格式,确保时间展示符合需求。
内容的提问来源于stack exchange,提问作者Joven Nicolas
相关产品推荐
相关产品推荐

