将值从源范围粘贴到目标范围(非相邻列,将目标范围值保留在某些列中)
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);
}
- 在此模式中,使用
getValues
和 setValues
检索并放置值,目标 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”未更改。
注:
- 请根据您的实际情况选择以上脚本之一。
参考文献:
我正在尝试从源范围粘贴到目标范围,但跳过目标中的一列并保留其中的值(在附加的 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);
}
- 在此模式中,使用
getValues
和setValues
检索并放置值,目标 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”未更改。
注:
- 请根据您的实际情况选择以上脚本之一。