用于将一列中的数据与一行进行比较并写入相应列的脚本

时间:2018-09-28 16:53:04

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

我的脚本的第一部分工作正常,因为它们是基本命令。首先清除存在的数据,以便准备重写。第二个按区域和开始日期对数据进行排序。我被困在第三部分。

在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);
  }
}
}

enter image description here

1 个答案:

答案 0 :(得分:1)

  • 您希望将“ C”列和“ D”列的日期与“ L1:NL1”的日期相对应。
  • 您要将列“ E”的值放在对应范围的第一个单元格中。
  • 您要将对应范围的背景颜色更改为#b7e1cd

如果我对您的问题的理解是正确的,那么此修改如何?从您的问题中,我可以理解,“在重新写入之前清除当前数据”和“按区域对数据进行排序然后再从开始日期开始”这两个脚本都可以正常工作。所以我修改了“第三部分”。我认为针对您的情况有几种解决方案。因此,请将此视为其中之一。

流量:

此修改的流程如下。

  1. 检索“ C3:E”的值。
  2. 检索日期“ L1:NL1”。
  3. 将“ C3:E”值的每一行与“ L1:NL1”的日期进行比较,并创建一个数组以在输出中使用。
  4. 创建2个新数组以放入单元格“ L3:NL”。这些用于值和背景色。
  5. 使用在第3节中创建的数组将值放入2个新数组。
  6. 输入值并设置背景颜色。

修改后的脚本:

请按如下所示修改脚本。

从:
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);

注意:

  • 如果您不想更改背景颜色,请从.setBackgrounds(colors)中删除sheet.getRange("L3:NL" + (row + 2)).setValues(values).setBackgrounds(colors)

参考文献:

如果我误解了您的问题,请告诉我。我想修改它。

已添加:

如果要使用包含内部标题的示例电子表格,请进行以下修改。

发件人:

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);