将值从源范围粘贴到目标范围(非相邻列,将目标范围值保留在某些列中)

Paste value from source range to target range (non-adjacent columns, keeping target range values in certain columns)

我正在尝试从源范围粘贴到目标范围,但跳过目标中的一列并保留其中的值(在附加的 sample 中,我想保留 C 列中的值(其他列)。但无法找到保留这些值的方法或完全跳过该列。这是我正在使用的代码:

function appendSheet1ToSheet2() {
      const ss = SpreadsheetApp.getActive();
      const source = ss.getRange('Sheet1!A1:C');
      const target = ss.getRange('Sheet2!A1:D');
      appendUniquesToRange_(source, target);
    }
    
    function appendUniquesToRange_(sourceRange, targetRange) {
      const dataToAppend = sourceRange.getValues().map(row => [row[0], row[1], ,row[2]]);
      const existingData = targetRange.getValues()
      const newData = existingData
        .concat(dataToAppend) 
        .filter((row, rowIndex, array) =>
          array
            .map(tuple => tuple[0])
            .indexOf(row[0]) === rowIndex && row[0] !== ''
        );
      targetRange
        .offset(0, 0, newData.length, newData[0].length)
        .setValues(newData);
    }

我已经尝试将 target 定义为范围列表,但随后我在第二个函数中遇到其他错误“TypeError: targetRangeList.getValues is not a function”

  const target = ss
    .getRangeList(['Sheet2!A1:B', 'Sheet2!D1:D'])
    .getRanges()
    .map(range => range.getValues());

不知道怎么解决。

我相信你的目标如下。

  • 您想将源 sheet 中的值放到目标 sheet 中。此时,你想跳过目的地sheet的“C”列。

你的情况,下面的修改怎么样?

修改后的脚本 1:

本次修改,请修改appendUniquesToRange_如下。

function appendUniquesToRange_(sourceRange, targetRange) {
  const dataToAppend = sourceRange.getValues();
  const [header, ...existingData] = targetRange.getValues();
  const newData = [header, ...dataToAppend.map((r, i) => [r[0], r[1], existingData[i][2], r[2]])];
  console.log(newData)
  targetRange
    .offset(0, 0, newData.length, newData[0].length)
    .setValues(newData);
}

修改脚本 2:

本次修改,请修改appendSheet1ToSheet2如下。

function appendSheet1ToSheet2() {
  const ss = SpreadsheetApp.getActive();
  const source = ss.getRange('Sheet1!A1:C');
  const target = ss.getSheetByName('Sheet2');
  const {ab, d} = source.getValues().reduce((o, r) => {
    const temp = r.splice(0, 2);
    o.ab.push(temp);
    o.d.push(r);
    return o;
  }, {ab: [], d: []});
  target.getRange(2, 1, ab.length, ab[0].length).setValues(ab);
  target.getRange(2, 4, d.length, d[0].length).setValues(d);
}
  • 在此模式中,使用 getValuessetValues 检索并放置值,目标 sheet 的列“C”未更改。

修改脚本 3:

本次修改,请修改appendSheet1ToSheet2如下。

function appendSheet1ToSheet2() {
  const ss = SpreadsheetApp.getActive();
  const source = ss.getSheetByName("Sheet1").getRangeList(["A1:B", "C1:C"]).getRanges();
  const target = ss.getSheetByName('Sheet2').getRangeList(["A2", "D2"]).getRanges();
  source.forEach((r, i) => r.copyTo(target[i]));
}
  • 在此模式中,使用 copyTo 复制值,目标 sheet 的列“C”未更改。

注:

  • 请根据您的实际情况选择以上脚本之一。

参考文献: