Syn c строка данных на основе уникального идентификатора в скриптах листов Google - PullRequest
0 голосов
/ 11 марта 2020

В настоящее время у меня есть код, который делает что-то очень похожее на это, но я не уверен, что нужно внести небольшие изменения, чтобы он работал правильно. Прямо сейчас приведенный ниже код сравнивает две строки уникальных идентификаторов, и если идентификаторы совпадают, он копирует ячейку в столбце «Комментарии» на другой лист.

function setComments() {

  var ss = SpreadsheetApp.getActive(),
      compare1 = "", compare2 = "",

      outputSheet = ss.getSheetByName("Sheet2"),
      sourceSheet = ss.getSheetByName("Sheet1"),

      range1 = outputSheet.getDataRange(),
      range2 = sourceSheet.getDataRange(),

      lastCol1 = range1.getNumColumns(),
      lastCol2 = range2.getNumColumns(),

      values1 = range1.getValues(),
      values2 = range2.getValues(),

      // get the range of the titles
      titleSection1 = outputSheet.getRange(1,1,1, lastCol1),
      titleSection2 = sourceSheet.getRange(1,1,1, lastCol2),

      // get the values from the titles
      titles1 = titleSection1.getValues(),
      titles2 = titleSection2.getValues(),

      // get the column # for "ID" and "comment"
      idCol1 = titles1[0].indexOf("ID"),
      idCol2 = titles2[0].indexOf("ID"),
      commentsCol1 = titles1[0].indexOf("comment"),
      commentsCol2 = titles2[0].indexOf("comment");

  // get the IDs from range1
  for (i = 1; i < values1.length; i++) { 
    compare1 = values1[i][idCol1];

    // get the IDs from range2
    for (j = 1; j< values2.length; j++){
      compare2 = values2[j][idCol2];

      // if same ID, change the values array
      if (compare1 == compare2) {
        values1[i][commentsCol1] = values2[j][commentsCol2];
      }
    }
  }
  // set values based on the values array
  range1.setValues(values1);
}

Вместо этого, если есть изменение, внесенное в любую ячейку на листе 1, позволит найти идентичную ячейку на основе уникального идентификатора на другом листе и синхронизировать c изменение. Какие изменения мне нужно внести, чтобы эта работа?

Например, если я изменю, какой офис находится в строке с идентификатором 1 на листе 1, он произведет такое же изменение для идентификатора 1 на листе 2. Вот пример листа того, с чем я работаю:

Sheet 1:
ID   Comment   Number   Office    Clinician 
1    good       22345    Dallas  
2    bad        12345    Denton
3    good       95954    Lubbock
4    bad        20204    FT.W
5    bad        11111    Denton
6    good       02944    Preston
Sheet 2:
ID   Comment   Number   Office    Clinician 
1    good       22345    Dallas 
3    good       95954    Lubbock
5    bad        11111    Denton

1 Ответ

1 голос
/ 15 марта 2020

У вас есть один набор данных на Листе 1 и подмножество этого набора данных на Листе 1. Ключевым полем является «ID». Если есть изменения в данных на листе 1, а идентификатор, относящийся к этому изменению, найден на листе 2, то вы хотите обновить соответствующий набор данных на листе 2.

Ключевые аспекты этого ответа:

  • onEdit(e): это простой триггер .
  • e.range: «диапазон» - это Объект события . Используя атрибут «е»; можно восстановить значительный объем информации об изменениях. Кроме того, объекты событий могут в дальнейшем использоваться для получения дополнительной информации, например (в данном случае) строки, столбца и имени листа.
  • filter(String).length: иногда получение последней строки данных проблематично c. Ответ получает все данные в столбце A и использует метод Javascript " array.filter ". В этом случае просто подсчитывает значения как строки, и если полученное значение равно Последнему ряду данных.
  • оператор "IF" оценивает несколько атрибутов:
    • Является ли редактирование на Листе 1?
    • Это редактирование строки между заголовком и последней строкой?
    • Является ли редактирование в столбце, который содержит данные?
    • оператор "&&", который требует, чтобы каждый из атрибутов возвращал true.
  • targetdata.map(function(e){return e[0];});: скрипт получает ВСЕ данные на Sheet2, но использует метод Javascript array.map , чтобы сгенерировать тему только значений в столбце 1 (столбец ID).
  • targetCol1.indexOf(sourceID);: скрипт использует Javascript " array.indexOf "; если идентификатор найден, он вернет номер строки на листе 2; если значение не найдено, возвращается «-1». Позволяет записать инструкцию logi c, которая будет выполняться, только если значение не равно «-1»
  • target.getRange(+result+1,1,1,sourceLC).setValues(sourcedatatocopy): последние строки скрипта получают значения в отредактированной строке на листе 1, а затем обновите значения на листе 2. Примечание: он обновляет все значения для совпадающего идентификатора, а не идентифицирует измененное поле и обновляет только это поле.

function onEdit(e) {

  // setup spreadsheet and sheet names
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSN = "Sheet1";
  var source = ss.getSheetByName(sourceSN);
  var targetSN = "Sheet2";
  var target = ss.getSheetByName(targetSN);

  // get row, column and sheet of the edited sheet
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var editedsheet = e.range.getSheet().getSheetName();
  // Logger.log("DEBUG: editedsheet = "+editedsheet)

  // get the ID column from Sheet 1
  var SourceCol1Vals = ss.getRange("A2:A").getValues();
  var SourceLR = SourceCol1Vals.filter(String).length;    
  // assign value to last column
  var sourceLC = 5;

  // test for sheet, row range and column range
  if (editedsheet == sourceSN && row >=2 && row <=SourceLR && col <=5){
    //Logger.log("DEBUG: this is sheet 1 & the right row and the right Col")
    // get the data for this row
    var sourcedata = source.getRange(row,1,1,5).getValues();

    // get the data from target
    var targetdata = target.getDataRange().getValues();
    // get only the ID column
    var targetCol1 = targetdata.map(function(e){return e[0];});
    // get the sourse ID
    var sourceID = sourcedata[0][0];
    // Logger.log("DEBUG: source ID = "+sourceID)

    // search for source ID on the Target list
    var result = targetCol1.indexOf(sourceID);
    // Logger.log("DEBUG: id was found at "+result);

    if (result !=-1){
      // if -1 then couldn't find the ID, otherwise it returns the index number where it finds the match
      // get the data for the Source ID
      var sourcedatatocopy = source.getRange(row,1,1,sourceLC).getValues();
      // update the darget for the sourceID data.
      target.getRange(+result+1,1,1,sourceLC).setValues(sourcedatatocopy)
    }

  } else{
      // Logger.log("DEBUG: not sheet 1 or  right row or right col");
  }

return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...