Скрипт для сравнения данных в одном столбце с одной строкой и записи в соответствующий столбец - PullRequest
0 голосов
/ 28 сентября 2018

Первая часть моего скрипта работает нормально, поскольку они являются основными командами.Первый очищает имеющиеся данные, поэтому они готовы к перезаписи.Вторая сортирует данные по регионам и дате начала.Я застрял на 3-й части.

У меня есть набор дат в столбце C с строкой темы в столбце E. У меня есть соответствующие даты в строке 1 Столбцы от L до NL.Я пытаюсь написать скрипт, который будет брать дату каждой строки, сравнивать ее со столбцами L: NL и, если есть совпадение, вставит тему в соответствующую ячейку.

Я знаю, что что-то не так с моим оператором for или с моим оператором if, потому что сейчас он записывает тему каждой строки только в столбце L.

Вот пример таблица .

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 голосов
/ 29 сентября 2018
  • Вы хотите, чтобы даты столбца "C" и столбца "D" соответствовали датам "L1: NL1" в качестве диапазона.
  • Вы хотите указать значение столбца "E "к первой ячейке соответствующего диапазона.
  • Вы хотите изменить цвет фона соответствующего диапазона на #b7e1cd.

Если мое понимание вашего вопроса вернокак насчет этой модификации?Из вашего вопроса я понял, что оба сценария «Очистить текущие данные перед обработкой и записью» и «Сортировать данные по региону и дате начала» работают нормально.Так что я модифицировал про "3-ю часть"Я думаю, что есть несколько решений для вашей ситуации.Поэтому, пожалуйста, подумайте об этом как об одном из них.

Поток:

Поток этой модификации выглядит следующим образом.

  1. Получите значения "C3: E".
  2. Получить даты "L1: NL1".
  3. Сравните каждую строку значений "C3: E" с датами "L1: NL1" и создайте массив для использования привывод.
  4. Создайте 2 новых массива для помещения в ячейки "L3: NL".Они используются для значений и цветов фона.
  5. Поместите значения в 2 новых массива, используя массив, созданный в разделе 3.
  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).

Ссылки:

Если я неправильно понимаю ваш вопрос, скажи пожалуйста.Я хотел бы изменить его.

Добавлено:

Если вы хотите использовать образец электронной таблицы, включая внутренние заголовки, измените ее следующим образом.

From:

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