将一列中的数据与一行中的数据进行比较并写入相应列的脚本
Script to compare data in one column against one row and write to corresponding column
我的脚本的第一部分工作正常,因为它们是基本命令。第一个清除存在的数据,以便它可以被重写。第二个按地区和开始日期对数据进行排序。我被困在第三部分。
我在 C 列中有一组日期,在 E 列中有一个主题行。我在第 1 行 L 到 NL 列中有相应的日期。我正在尝试编写一个脚本,它将获取每一行的日期,将其与列 L:NL 进行比较,如果匹配,它将把主题粘贴到相应的单元格中。
我知道我的 for
语句或 if
语句有问题,因为现在它只在 L 列中写入每一行的主题。
这是一个例子spreadsheet。
function clear_Sort_Label() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
//Clear current data before resort and write
var rangesToClear = sheet.getRange("L3:NL");
rangesToClear.clearContent();
//Sort the data by region then start date
var range = sheet.getRange("A2:K");
range.sort([{column: 2, ascending: true}, {column: 3, ascending: true}]);
//Compare Start date (Column C) against dates in Row 1 Columns L:NL
//Each match paste value from subject (Column E) in coresponding cell
var lastRow = sheet.getMaxRows()
var lastCol = sheet.getMaxColumns()
for (var i=3; i<lastRow; i++) {
var meetingSubject = sheet.getRange(i,5).getValue();
var startDay = sheet.getRange(i,3).getValue();
Logger.log(startDay)
var day = sheet.getRange(1,12,1,lastCol).getValues()[0];
if(startDay = day){
sheet.getRange(i,12).setValue(meetingSubject);
}
}
}
- 您想将 "C" 列和 "D" 列的日期对应到 "L1:NL1" 的日期作为范围。
- 您想将第 "E" 列的值放入相应区域的第一个单元格。
- 你想把对应范围的背景颜色改成
#b7e1cd
。
如果我对你问题的理解是正确的,那么这个修改怎么样?根据您的问题,我了解到 "Clear current data before resort and write" 和 "Sort the data by region then start date" 的脚本都可以正常工作。所以我修改了关于"the 3rd part"。我认为您的情况有几种解决方案。所以请将此视为其中之一。
流量:
本次修改流程如下
- 检索 "C3:E" 的值。
- 检索 "L1:NL1" 的日期。
- 将 "C3:E" 的每一行值与 "L1:NL1" 的日期进行比较,并创建一个数组用于输出。
- 创建 2 个新数组以放入单元格 "L3:NL"。这些用于值和背景颜色。
- 使用在第 3 部分创建的数组将值放入 2 个新数组。
- 输入值并设置背景颜色。
修改后的脚本:
请按如下方式修改您的脚本。
从:
var lastRow = sheet.getMaxRows()
var lastCol = sheet.getMaxColumns()
for (var i=3; i<lastRow; i++) {
var meetingSubject = sheet.getRange(i,5).getValue();
var startDay = sheet.getRange(i,3).getValue();
Logger.log(startDay)
var day = sheet.getRange(1,12,1,lastCol).getValues()[0];
if(startDay = day){
sheet.getRange(i,12).setValue(meetingSubject);
}
到:
var values = sheet.getRange("C3:E").getValues().filter(function(e) {return e.some(function(f){return f})}).map(function(e) {return [e[0].getTime(), e[1].getTime(), e[2]]});
var dates = sheet.getRange("L1:NL1").getValues()[0].map(function(e) {return e.getTime()});
var res = values.reduce(function(ar1, e, i) {
var r = dates.reduce(function(ar2, f, j) {
if (f == e[0]) ar2.push([e[2], i, j]);
if (f == e[1]) ar2.push(j);
return ar2;
}, []);
if (r.length == 2) ar1.push(Array.prototype.concat.apply([], r));
return ar1;
}, []);
var row = values.length;
var col = dates.length;
var values = Array.apply(null, Array(row)).map(function() {return Array.apply(null, Array(col)).map(function() {return ""})});
var colors = Array.apply(null, Array(row)).map(function() {return Array.apply(null, Array(col)).map(function() {return ""})});
res.forEach(function(e) {
values[e[1]][e[2]] = e[0];
for (var i = e[2]; i <= e[3]; i++) {
colors[e[1]][i] = "#b7e1cd";
}
});
sheet.getRange("L3:NL" + (row + 2)).setValues(values).setBackgrounds(colors);
注:
- 如果您不想更改背景颜色,请从
sheet.getRange("L3:NL" + (row + 2)).setValues(values).setBackgrounds(colors)
中删除 .setBackgrounds(colors)
。
参考文献:
如果我误解了你的问题,请告诉我。我想修改一下。
已添加:
如果您想使用包含内部headers的示例电子表格,请按如下方式修改。
发件人:
var values = sheet.getRange("C3:E").getValues().filter(function(e) {return e.some(function(f){return f})}).map(function(e) {return [e[0].getTime(), e[1].getTime(), e[2]]});
var dates = sheet.getRange("L1:NL1").getValues()[0].map(function(e) {return e.getTime()});
var res = values.reduce(function(ar1, e, i) {
var r = dates.reduce(function(ar2, f, j) {
if (f == e[0]) ar2.push([e[2], i, j]);
if (f == e[1]) ar2.push(j);
收件人:
var values = sheet.getRange("A3:E").getValues().filter(function(e) {return e.some(function(f){return f})}).map(function(e) {return [e[0], e[2].getTime(), e[3].getTime(), e[4]]});
var dates = sheet.getRange("L1:NL1").getValues()[0].map(function(e) {return e.getTime()});
var res = values.reduce(function(ar1, e, i) {
var r = dates.reduce(function(ar2, f, j) {
if (e[0] && f == e[1]) ar2.push([e[3], i, j]);
if (e[0] && f == e[2]) ar2.push(j);
我的脚本的第一部分工作正常,因为它们是基本命令。第一个清除存在的数据,以便它可以被重写。第二个按地区和开始日期对数据进行排序。我被困在第三部分。
我在 C 列中有一组日期,在 E 列中有一个主题行。我在第 1 行 L 到 NL 列中有相应的日期。我正在尝试编写一个脚本,它将获取每一行的日期,将其与列 L:NL 进行比较,如果匹配,它将把主题粘贴到相应的单元格中。
我知道我的 for
语句或 if
语句有问题,因为现在它只在 L 列中写入每一行的主题。
这是一个例子spreadsheet。
function clear_Sort_Label() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
//Clear current data before resort and write
var rangesToClear = sheet.getRange("L3:NL");
rangesToClear.clearContent();
//Sort the data by region then start date
var range = sheet.getRange("A2:K");
range.sort([{column: 2, ascending: true}, {column: 3, ascending: true}]);
//Compare Start date (Column C) against dates in Row 1 Columns L:NL
//Each match paste value from subject (Column E) in coresponding cell
var lastRow = sheet.getMaxRows()
var lastCol = sheet.getMaxColumns()
for (var i=3; i<lastRow; i++) {
var meetingSubject = sheet.getRange(i,5).getValue();
var startDay = sheet.getRange(i,3).getValue();
Logger.log(startDay)
var day = sheet.getRange(1,12,1,lastCol).getValues()[0];
if(startDay = day){
sheet.getRange(i,12).setValue(meetingSubject);
}
}
}
- 您想将 "C" 列和 "D" 列的日期对应到 "L1:NL1" 的日期作为范围。
- 您想将第 "E" 列的值放入相应区域的第一个单元格。
- 你想把对应范围的背景颜色改成
#b7e1cd
。
如果我对你问题的理解是正确的,那么这个修改怎么样?根据您的问题,我了解到 "Clear current data before resort and write" 和 "Sort the data by region then start date" 的脚本都可以正常工作。所以我修改了关于"the 3rd part"。我认为您的情况有几种解决方案。所以请将此视为其中之一。
流量:
本次修改流程如下
- 检索 "C3:E" 的值。
- 检索 "L1:NL1" 的日期。
- 将 "C3:E" 的每一行值与 "L1:NL1" 的日期进行比较,并创建一个数组用于输出。
- 创建 2 个新数组以放入单元格 "L3:NL"。这些用于值和背景颜色。
- 使用在第 3 部分创建的数组将值放入 2 个新数组。
- 输入值并设置背景颜色。
修改后的脚本:
请按如下方式修改您的脚本。
从:var lastRow = sheet.getMaxRows()
var lastCol = sheet.getMaxColumns()
for (var i=3; i<lastRow; i++) {
var meetingSubject = sheet.getRange(i,5).getValue();
var startDay = sheet.getRange(i,3).getValue();
Logger.log(startDay)
var day = sheet.getRange(1,12,1,lastCol).getValues()[0];
if(startDay = day){
sheet.getRange(i,12).setValue(meetingSubject);
}
到:
var values = sheet.getRange("C3:E").getValues().filter(function(e) {return e.some(function(f){return f})}).map(function(e) {return [e[0].getTime(), e[1].getTime(), e[2]]});
var dates = sheet.getRange("L1:NL1").getValues()[0].map(function(e) {return e.getTime()});
var res = values.reduce(function(ar1, e, i) {
var r = dates.reduce(function(ar2, f, j) {
if (f == e[0]) ar2.push([e[2], i, j]);
if (f == e[1]) ar2.push(j);
return ar2;
}, []);
if (r.length == 2) ar1.push(Array.prototype.concat.apply([], r));
return ar1;
}, []);
var row = values.length;
var col = dates.length;
var values = Array.apply(null, Array(row)).map(function() {return Array.apply(null, Array(col)).map(function() {return ""})});
var colors = Array.apply(null, Array(row)).map(function() {return Array.apply(null, Array(col)).map(function() {return ""})});
res.forEach(function(e) {
values[e[1]][e[2]] = e[0];
for (var i = e[2]; i <= e[3]; i++) {
colors[e[1]][i] = "#b7e1cd";
}
});
sheet.getRange("L3:NL" + (row + 2)).setValues(values).setBackgrounds(colors);
注:
- 如果您不想更改背景颜色,请从
sheet.getRange("L3:NL" + (row + 2)).setValues(values).setBackgrounds(colors)
中删除.setBackgrounds(colors)
。
参考文献:
如果我误解了你的问题,请告诉我。我想修改一下。
已添加:
如果您想使用包含内部headers的示例电子表格,请按如下方式修改。
发件人:
var values = sheet.getRange("C3:E").getValues().filter(function(e) {return e.some(function(f){return f})}).map(function(e) {return [e[0].getTime(), e[1].getTime(), e[2]]});
var dates = sheet.getRange("L1:NL1").getValues()[0].map(function(e) {return e.getTime()});
var res = values.reduce(function(ar1, e, i) {
var r = dates.reduce(function(ar2, f, j) {
if (f == e[0]) ar2.push([e[2], i, j]);
if (f == e[1]) ar2.push(j);
收件人:
var values = sheet.getRange("A3:E").getValues().filter(function(e) {return e.some(function(f){return f})}).map(function(e) {return [e[0], e[2].getTime(), e[3].getTime(), e[4]]});
var dates = sheet.getRange("L1:NL1").getValues()[0].map(function(e) {return e.getTime()});
var res = values.reduce(function(ar1, e, i) {
var r = dates.reduce(function(ar2, f, j) {
if (e[0] && f == e[1]) ar2.push([e[3], i, j]);
if (e[0] && f == e[2]) ar2.push(j);