Добавление данных между вкладками листа Google с помощью GAS - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу добавить некоторые данные из одной вкладки в Google Sheet в другую.Как только данные добавлены, я хочу обновить столбец с именем «Добавлен» и установить для него значение «Да».Мой код должен затем пропустить все строки, которые уже были добавлены, однако я новичок, так что для меня все это немного ново.

function dumpSMSintoSender() {
    var MOVED_TO_SENDER = "Yes";
    var userSheet = SpreadsheetApp.getActiveSpreadsheet();
    var userTab = userSheet.getSheetByName('SmartCare');
    var SenderTab = userSheet.getSheetByName('Sheet1');
    var numRows = 200
    var firstRow = 2;
    var range = userTab.getRange(firstRow, 3, userTab.getLastRow() - firstRow +1, 3);
    var data = range.getValues();
    var dataRange = userTab.getRange(firstRow, 3, numRows, 10)
    // Fetch values for each row in the Range.
    var Movedata = dataRange.getValues();

    for (var i = 0; i < Movedata.length; ++i) {
        var row = Movedata[i];
        var MovedtoSender = row[5];
        var sender = row[0];
        var mobile = row[1];
        var message = row[2];
        if (mobile != "") {
            if (MovedtoSender != MOVED_TO_SENDER) {  // Prevents sending duplicates
                SenderTab.getRange(SenderTab.getLastRow() + 1, 1, data.length,3).setValues(data);
                userTab.getRange(firstRow + i, 8).setValue("Yes");
                // Make sure the cell is updated right away in case the script is interrupted
                SpreadsheetApp.flush();
            }
        }
    }
}

То, что на самом деле происходит, происходит для каждого цикла черезкод, это добавлено все из листа.Поэтому, если нужно добавить 5 записей, на новой вкладке появятся 25 новых записей, поскольку каждая запись добавляется 5 раз (по одному разу для каждой итерации).Можно ли изменить код так, чтобы он добавлял только те строки, для которых столбец «Добавлен» имеет значение NULL?

1 Ответ

1 голос
/ 16 апреля 2019

Я попытался упростить задачу и проверить два элемента - мобильный (MOBILE_COL) и перешел к отправителю (MOVED_TO_SENDER_COL) вне цикла.Они определены сверху, чтобы учесть любые будущие изменения, такие как MOVED_TO_SENDER.

Затем получаем userTab весь диапазон и значения листа.И сравнивая значения, как показано в приведенном выше коде, строка за строкой, чтобы найти новую строку, которая не была добавлена ​​ранее.

Когда новая строка найдена, добавьте ее в массив results и обновите добавленное значение этой текущей строки до «Да».Как только у нас есть все новые строки в массиве results, мы записываем их в senderTab.И обновите userTab с обновленным userValues.

Хитрость здесь в том, чтобы собрать все новые строки и записать их вместе за один раз.Это быстрее, чем писать построчно.Тот же метод применяется при обновлении userTab.Мы обновляем userValues, который находится в памяти, и, наконец, за один раз записываем весь массив на шаг userTab.

function dumpSMSintoSender() {
  // value to check for
  var MOVED_TO_SENDER = 'Yes';
  // which column is mobile, which is first item to test
  var MOBILE_COL = 4; // A = 1, B = 2 etc
  // which column is move to sender = appended, which is second item to test
  var MOVED_TO_SENDER_COL = 8; // A = 1, B = 2 etc

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var userTab = ss.getSheetByName('SmartCare');
  var senderTab = ss.getSheetByName('Sheet1');

  // getting userTab full sheet range and values
  var userRange = userTab.getDataRange();
  var userValues = userRange.getValues();

  // array to keep new append-able rows
  var results = [];

  // for each row in userValues check to see if append-able
  // if yes, add to results array and update userValues array by setting appended to 'Yes'
  userValues.forEach(function(row) {
    if (row[MOBILE_COL - 1] != '') {
      if (row[MOVED_TO_SENDER_COL - 1] != MOVED_TO_SENDER) {
        results.push(row);
        row[MOVED_TO_SENDER_COL - 1] = MOVED_TO_SENDER;
      }
    }
  });

  // write new rows to senderTab
  senderTab
    .getRange(senderTab.getLastRow() + 1, 1, results.length, results[0].length)
    .setValues(results);
  // update userTab
  userRange.setValues(userValues);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...