应用程序脚本:如何使用 .getRangeList 设置每个单元格的值?
App Script: How to set the values of each cell using the .getRangeList?
我正在使用 .SetValues
尝试填充我通过此行选择的每个单元格 var targetSheetRange = targetSheet.getRangeList(arr1);
不幸的是,当我这样做时,它总是 return 将我的目标中所有剩余单元格的第一个单元格的值设置为 sheet,而不是设置每个单元格的值来源 Sheet.
这是我的代码:
function filtersCopyData() {
var dTable = SpreadsheetApp.getActiveSpreadsheet();
var sSheetDay = dTable.getSheetByName('Day 1'); // Source Sheet
var sheetRange = sSheetDay.getRangeList(['K3','K4','K5','K6','K7']).getRanges().map(range => range.getValues());
var targetSheet = dTable.getSheetByName('All Filters report'); // Target Sheet
var arr1 = ['B4:C4', 'B6:C6', 'B7:C7', 'B9:C9', 'B10:C10'];
var targetSheetRange = targetSheet.getRangeList(arr1);
targetSheetRange.setValue(sheetRange);
}
K3值为9,K4值为20,K5值为10,K6值为10,K7值为10
targetSheetRange.setValue(sheetRange);
当此代码为运行时,arr1中的所有单元格return的值为9,而不是从Source中复制每个单元格的值Sheet.
我希望我试图完成的这件事对代码有意义,PS。我真的是初学者。谢谢大家!
正在使用值的范围列表写入范围列表
function filtersCopyData() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0'); // Source Sheet
const vs = sh.getRangeList(['K3','K4','K5','K6','K7']).getRanges().map(range => range.getValue());
const tsh = ss.getSheetByName('Sheet1');
const arr1 = ['B4:C4', 'B6:C6', 'B7:C7', 'B9:C9', 'B10:C10'];
const rgl = breakUpRangeList(ss,tsh,tsh.getRangeList(arr1));
const l = rgl.getRanges().length;
rgl.getRanges().forEach((r,i) => {
let a1 = r.getA1Notation();
let idx = i % arr1.length;
r.setValue(vs[idx]);
});
}
function breakUpRangeList(ss=SpreadsheetApp.getActive(),sh=ss.getSheetByName("Sheet0"),rgl) {
let b = [];
rgl.getRanges().forEach(rg => {
rg.getValues().forEach((r,i) => {
let row = rg.getRow() + i;
r.forEach((c, j) => {
let col = rg.getColumn() + j;
b.push(sh.getRange(row, col).getA1Notation())
})
})
})
//Logger.log(JSON.stringify(b));
return sh.getRangeList(b);
}
描述
RangeList 是数组而不是范围。我什至对你的脚本感到惊讶 运行。您必须使用 Array.forEach 来设置 non-contiguous 运行ges 的值。
您正在创建一个 RangeList,然后获取每个 运行ge 的 A1Notation。您可以简单地定义一个 运行ge A1Notations.
数组
请注意,在我的测试中,有些名称与您的名称不同 sheet。
脚本
function test() {
try {
var spread = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spread.getSheetByName("Data");
var rangeList = ["A1","A3","A5"];
var values = rangeList.map( range => sheet.getRange(range).getValue() );
rangeList = ["C1:D1","C3:D3","C5:D5"];
rangeList.forEach( (range,index) => sheet.getRange(range).setValues([[values[index],values[index]]]));
}
catch(err) {
console.log(err);
}
}
参考
我正在使用 .SetValues
尝试填充我通过此行选择的每个单元格 var targetSheetRange = targetSheet.getRangeList(arr1);
不幸的是,当我这样做时,它总是 return 将我的目标中所有剩余单元格的第一个单元格的值设置为 sheet,而不是设置每个单元格的值来源 Sheet.
这是我的代码:
function filtersCopyData() {
var dTable = SpreadsheetApp.getActiveSpreadsheet();
var sSheetDay = dTable.getSheetByName('Day 1'); // Source Sheet
var sheetRange = sSheetDay.getRangeList(['K3','K4','K5','K6','K7']).getRanges().map(range => range.getValues());
var targetSheet = dTable.getSheetByName('All Filters report'); // Target Sheet
var arr1 = ['B4:C4', 'B6:C6', 'B7:C7', 'B9:C9', 'B10:C10'];
var targetSheetRange = targetSheet.getRangeList(arr1);
targetSheetRange.setValue(sheetRange);
}
K3值为9,K4值为20,K5值为10,K6值为10,K7值为10
targetSheetRange.setValue(sheetRange);
当此代码为运行时,arr1中的所有单元格return的值为9,而不是从Source中复制每个单元格的值Sheet.
我希望我试图完成的这件事对代码有意义,PS。我真的是初学者。谢谢大家!
正在使用值的范围列表写入范围列表
function filtersCopyData() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0'); // Source Sheet
const vs = sh.getRangeList(['K3','K4','K5','K6','K7']).getRanges().map(range => range.getValue());
const tsh = ss.getSheetByName('Sheet1');
const arr1 = ['B4:C4', 'B6:C6', 'B7:C7', 'B9:C9', 'B10:C10'];
const rgl = breakUpRangeList(ss,tsh,tsh.getRangeList(arr1));
const l = rgl.getRanges().length;
rgl.getRanges().forEach((r,i) => {
let a1 = r.getA1Notation();
let idx = i % arr1.length;
r.setValue(vs[idx]);
});
}
function breakUpRangeList(ss=SpreadsheetApp.getActive(),sh=ss.getSheetByName("Sheet0"),rgl) {
let b = [];
rgl.getRanges().forEach(rg => {
rg.getValues().forEach((r,i) => {
let row = rg.getRow() + i;
r.forEach((c, j) => {
let col = rg.getColumn() + j;
b.push(sh.getRange(row, col).getA1Notation())
})
})
})
//Logger.log(JSON.stringify(b));
return sh.getRangeList(b);
}
描述
RangeList 是数组而不是范围。我什至对你的脚本感到惊讶 运行。您必须使用 Array.forEach 来设置 non-contiguous 运行ges 的值。
您正在创建一个 RangeList,然后获取每个 运行ge 的 A1Notation。您可以简单地定义一个 运行ge A1Notations.
数组请注意,在我的测试中,有些名称与您的名称不同 sheet。
脚本
function test() {
try {
var spread = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spread.getSheetByName("Data");
var rangeList = ["A1","A3","A5"];
var values = rangeList.map( range => sheet.getRange(range).getValue() );
rangeList = ["C1:D1","C3:D3","C5:D5"];
rangeList.forEach( (range,index) => sheet.getRange(range).setValues([[values[index],values[index]]]));
}
catch(err) {
console.log(err);
}
}
参考