如何将单行数据源批量追加到Google Sheets指定工作表的多行中?
解决方案
核心思路是把单行数据转换成包含7次重复的二维数组,然后一次性写入表格,避免多次重复调用API,既简化代码又提升执行效率。
优化后的代码如下:
function copytomaster(){ const sheet = SpreadsheetApp.openById("1Z319ABahpIhAKU8Hfc1J18Ss8_2kxFYYa1ySbjgDMQA"); const check_in_sheet = sheet.getSheetByName("Check In"); const master = sheet.getSheetByName("Data"); const lastrow = master.getLastRow() + 1; const rowCount = 7; // 固定重复7行 // 读取7行的核心数据 const check_in_values = check_in_sheet.getRange(11, 1, rowCount, 14).getValues(); // 读取单行数据并转换为7行重复的二维数组 const biometrics_values = Array(rowCount).fill(check_in_sheet.getRange(4,7,1,4).getValues()[0]); const sleep_values = Array(rowCount).fill([check_in_sheet.getRange(3,4,1,1).getValue()]); const steps_value = Array(rowCount).fill([check_in_sheet.getRange(4,4,1,1).getValue()]); const training_value = Array(rowCount).fill([check_in_sheet.getRange(3,6,1,1).getValue()]); const cardio_value = Array(rowCount).fill([check_in_sheet.getRange(4,6,1,1).getValue()]); const nutrition_values = Array(rowCount).fill(check_in_sheet.getRange(4,11,1,4).getValues()[0]); // 处理其他单行数据 const achievement_value = Array(rowCount).fill([check_in_sheet.getRange(7,3).getValue()]); const improvement_value = Array(rowCount).fill([check_in_sheet.getRange(7,7).getValue()]); const struggle_value = Array(rowCount).fill([check_in_sheet.getRange(7,11).getValue()]); const bb_value = Array(rowCount).fill([check_in_sheet.getRange(30,2).getValue()]); const nt_value = Array(rowCount).fill([check_in_sheet.getRange(31,2).getValue()]); const diet_value = Array(rowCount).fill([check_in_sheet.getRange(32,2).getValue()]); const ao_value = Array(rowCount).fill([check_in_sheet.getRange(33,2).getValue()]); const leaner_value = Array(rowCount).fill([check_in_sheet.getRange(30,5).getValue()]); const clothes_value = Array(rowCount).fill([check_in_sheet.getRange(31,5).getValue()]); const ms_value = Array(rowCount).fill([check_in_sheet.getRange(33,5).getValue()]); const alcohol_value = Array(rowCount).fill([check_in_sheet.getRange(32,5).getValue()]); const meds_value = Array(rowCount).fill([check_in_sheet.getRange(30,12).getValue()]); const travel_value = Array(rowCount).fill([check_in_sheet.getRange(31,12).getValue()]); const other_value = Array(rowCount).fill([check_in_sheet.getRange(32,12).getValue()]); const done_value = Array(rowCount).fill([check_in_sheet.getRange(33,13).getValue()]); const name_value = Array(rowCount).fill([check_in_sheet.getRange(1,1).getValue()]); // 一次性写入所有数据 master.getRange(lastrow, 1, rowCount, 14).setValues(check_in_values); master.getRange(lastrow, 15, rowCount, 4).setValues(biometrics_values); master.getRange(lastrow, 19, rowCount, 1).setValues(sleep_values); master.getRange(lastrow, 20, rowCount, 1).setValues(steps_value); master.getRange(lastrow, 21, rowCount, 1).setValues(training_value); master.getRange(lastrow, 22, rowCount, 1).setValues(cardio_value); master.getRange(lastrow, 23, rowCount, 4).setValues(nutrition_values); master.getRange(lastrow, 27, rowCount, 1).setValues(achievement_value); master.getRange(lastrow, 28, rowCount, 1).setValues(improvement_value); master.getRange(lastrow, 29, rowCount, 1).setValues(struggle_value); master.getRange(lastrow, 30, rowCount, 1).setValues(bb_value); master.getRange(lastrow, 31, rowCount, 1).setValues(nt_value); master.getRange(lastrow, 32, rowCount, 1).setValues(diet_value); master.getRange(lastrow, 33, rowCount, 1).setValues(ao_value); master.getRange(lastrow, 34, rowCount, 1).setValues(leaner_value); master.getRange(lastrow, 35, rowCount, 1).setValues(clothes_value); master.getRange(lastrow, 36, rowCount, 1).setValues(alcohol_value); master.getRange(lastrow, 44, rowCount, 1).setValues(ms_value); master.getRange(lastrow, 37, rowCount, 1).setValues(meds_value); master.getRange(lastrow, 38, rowCount, 1).setValues(travel_value); master.getRange(lastrow, 39, rowCount, 1).setValues(other_value); master.getRange(lastrow, 40, rowCount, 1).setValues(done_value); master.getRange(lastrow, 41, rowCount, 1).setValues(name_value); }
关键优化说明:
- 单行转多行:用
Array(rowCount).fill(...)快速生成重复7行的二维数组。多列单行数据先取一维数组再填充,单列单行数据把值包裹在数组中再填充,完美适配setValues的参数要求。 - 减少API调用:把原来几十次重复的
setValues/setValue调用缩减到20次以内,既提升脚本运行速度,又避免触发Google Apps Script的API调用次数限制。
内容的提问来源于stack exchange,提问作者Emily Beale
相关产品推荐
相关产品推荐

