【问题标题】:Paste value from source range to target range (non-adjacent columns, keeping target range values in certain columns)将值从源范围粘贴到目标范围(非相邻列,将目标范围值保留在某些列中)
【发布时间】:2022-01-01 08:06:22
【问题描述】:

我正在尝试从源范围粘贴到目标范围,但在目标中跳过一列并保留其中的值(在附加的 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());

不知道怎么解决。

【问题讨论】:

    标签: google-apps-script google-sheets spreadsheet


    【解决方案1】:

    我相信你的目标如下。

    • 您希望将源工作表中的值放到目标工作表中。此时,您想跳过目标工作表的“C”列。

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

    修改脚本一:

    在本次修改中,请将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 检索和放置值,并且目标工作表的“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 复制值,并且目标工作表的“C”列未更改。

    注意:

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

    参考资料:

    【讨论】:

    • 所有这些都可以完美运行,谢谢!我会确保也检查参考文献
    • @Debs 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多