如何在Google Sheets使用setValues复制数据时跳过指定列?
解决方案
要跳过C列并保留其中的数组公式,你不能直接从B列开始连续写入9列(这样会覆盖C列),而是需要拆分数据写入操作,单独写入B列和D-K列。
关键代码修改
找到Call Tracker分支中的这段代码:
datasheet_Call_Tracker.getRange(getLastRowByDirectionUp(datasheet_Call_Tracker, "B")+1,2,1,9).setValues(values);
替换为以下代码:
// 获取目标工作表的下一个空行 var targetRow = getLastRowByDirectionUp(datasheet_Call_Tracker, "B") + 1; // 写入B列(第2列),对应values的第一个元素 datasheet_Call_Tracker.getRange(targetRow, 2).setValue(values[0][0]); // 写入D到K列(第4至第11列),对应values中第2到第9个元素 datasheet_Call_Tracker.getRange(targetRow, 4, 1, 8).setValues([values[0].slice(1)]);
额外优化:移除重复函数定义
你的代码中getLastRowByDirectionUp函数被重复定义了两次(分别在两个分支里),这会导致语法错误。请将该函数移到submitData函数外部,作为全局函数:
function getLastRowByDirectionUp(sheet, col) { if(sheet.getRange(col + sheet.getLastRow()).getValue() == "") { return sheet.getRange(col + sheet.getLastRow()).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); } else { return sheet.getLastRow(); } } function submitData(){ // 原函数内容... }
完整修正后代码
function getLastRowByDirectionUp(sheet, col) { if(sheet.getRange(col + sheet.getLastRow()).getValue() == "") { return sheet.getRange(col + sheet.getLastRow()).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); } else { return sheet.getLastRow(); } } function submitData(){ var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet(); var shUserForm = myGoogleSheet.getSheetByName("Form"); var datasheet_KPI = myGoogleSheet.getSheetByName("Monthly KPI Records"); var datasheet_Call_Tracker = myGoogleSheet.getSheetByName("Call Tracker Records"); var formType = SpreadsheetApp.getActiveSheet().getRange('B4').getValue(); if (formType === 'Monthly Agent KPI') { var user = Session.getActiveUser().getUserLoginId(); var ui = SpreadsheetApp.getUi(); var response=ui.alert("Submit", "Do you want to Submit this Monthly Agent KPI record?", ui.ButtonSet.YES_NO); if(response==ui.Button.NO) { return; } var values = [[ shUserForm.getRange("E11").getDisplayValue() , shUserForm.getRange("F11").getValue(), shUserForm.getRange("G11").getValue(), shUserForm.getRange("H11").getValue(), shUserForm.getRange("I11").getValue(), shUserForm.getRange("J11").getValue(), shUserForm.getRange("K11").getValue(), shUserForm.getRange("L11").getValue(), shUserForm.getRange("M11").getValue(), shUserForm.getRange("N11").getValue(), shUserForm.getRange("O11").getValue(), ]]; datasheet_KPI.getRange(getLastRowByDirectionUp(datasheet_KPI, "A")+1,1,1,11).setValues(values); // 清空表单字段 shUserForm.getRange('E11:J11').clearContent(); shUserForm.getRange('K11').clearContent(); shUserForm.getRange('M11:O11').clearContent(); myGoogleSheet.toast("Monthly Agent KPI record added successfully!"); } else if (formType === 'Call Tracker') { var ui = SpreadsheetApp.getUi(); var response=ui.alert("Submit", "Do you want to Submit this Call Tracker record?", ui.ButtonSet.YES_NO); if(response==ui.Button.NO) { return; } var values = [[ shUserForm.getRange("E13").getDisplayValue() , shUserForm.getRange("F13").getValue(), shUserForm.getRange("G13").getValue(), shUserForm.getRange("H13").getValue(), shUserForm.getRange("I13").getValue(), shUserForm.getRange("J13").getValue(), shUserForm.getRange("K13").getValue(), shUserForm.getRange("L13").getValue(), shUserForm.getRange("M13").getValue(), ]]; // 修改后的写入逻辑:跳过C列 var targetRow = getLastRowByDirectionUp(datasheet_Call_Tracker, "B") + 1; datasheet_Call_Tracker.getRange(targetRow, 2).setValue(values[0][0]); datasheet_Call_Tracker.getRange(targetRow, 4, 1, 8).setValues([values[0].slice(1)]); // 清空表单字段 shUserForm.getRange('E13:M13').clearContent(); myGoogleSheet.toast("Call Tracker record added successfully!"); } }
说明
- 拆分写入操作后,代码只会修改B列和D-K列的单元格,完全不会触碰C列,因此不会覆盖其中的数组公式。
- 额外优化了表单清空逻辑,用
clearContent()替代多次setValue(''),代码更简洁高效。 - 移除了重复的函数定义,避免运行时错误。
内容的提问来源于stack exchange,提问作者Jarvis Davis
相关产品推荐
相关产品推荐

