Как обновить строку на другом листе на основе идентификатора, не перезаписывая пустыми ячейками? - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь скопировать строки с одного листа на другой с помощью Google Apps Script, основываясь на соответствующем идентификаторе в столбце 4 каждого, но я не могу найти, как вставить его в соответствующую строку и сделать это без перезаписи существующих данных пустыми ячейками.

В Google Sheets Sheet1 содержит строки новых данных, определенных идентификатором. Sheet2 должен собирать каждую строку, обновляя строки новыми данными, если идентификатор новой строки на Sheet1 совпадает с существующей строкой на Sheet2. В конце дня Sheet1 очищается, и остается только самая актуальная информация о каждом ID-элементе в Sheet2. Иногда строки на Листе 1 заполняются не полностью, и в этом случае только ячейки с данными (из Листа 1) должны быть перезаписаны на Листе 2.

Новые идентификаторы будут добавлены, но я уже более или менее разобрался, как это сделать, и это не часть вопроса:)

function myFunction() {
    // Path to Correct Spreadsheet
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheet3 = ss.getSheetByName("Sheet3"); //temporary, while I work out how to copy it to the right row in Sheet2

  // Get size of ranges
  var header = 1;  // Number of rows of header info (to skip)
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var data2 = data2 = range2.getValues();

      Logger.log('data1 = ' + data1);

  var resultArray = [];
  for(var n=header; n < data1.length ; n++){
    var keep = false;
    for(var p=header; p < data2.length ; p++){
      Logger.log(data1[n][0]+' =? '+data2[p][0]);
      if( data1[n][3] == data2[p][3]){
        resultArray.push(data1[n]);
        Logger.log('true');
        break ;
      }
    }
  }  
  sheet3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}

Мне удалось собрать воедино код, который находит совпадающие идентификаторы и отправляет всю строку в Sheet3 (сейчас, пока не выяснили, как отправить ее в правую строку в Sheet2). Но это перезаписывает любые существующие данные пустыми ячейками (если они есть), и я не могу заставить {contentOnly: true} работать (это даже правильный подход?)

Я занимался этим всего неделю, изо всех сил, но из глубины. Любая помощь, даже просто указатели в правильном направлении тем для изучения, будет принята с благодарностью. Последние 48 часов я жил в стеке и пытался найти что-то похожее на это, но я ничего не смог найти (возможно, я даже не ищу нужную вещь!). Очень унизительно.

1 Ответ

0 голосов
/ 06 апреля 2019

попробуйте это:

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheet3 = ss.getSheetByName("Sheet3");
  var header = 1;  // Number of rows of header info (to skip)
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var data2 = data2 = range2.getValues();
  var resultArray = [];
  for(var n=header; n < data1.length ; n++){
    var keep = false;
    for(var p=header; p < data2.length ; p++){
      if( data1[n][3] == data2[p][3]){
        var tA=[];
        var rg=sheet2.getRange(p+1,1,1,sheet2.getLastColumn());
        for(var i=0;i<data1[0].length;i++) {
          tA.push((data1[n][i])?data1[n][i]:data2[p][i]);
        }
        rg.setValues([tA]);
        break ;
      }
    }
  }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...