@alihang

Как сравнить два диапазона и выбрать нужные данные?

Здравствуйте, никак не могу понять, где я допустил ошибку. Задача состоит в том, чтобы взять данные из одной страницы и сравнить их с данными из другой страницы. Если совпадений нет, то выполнять запись данных из одной страницы в другую. Я написал небольшой скрипт, но при исполнении он записывает последний элемент массива, а должен по идее идти от первого вхождения к следующему. Прилагаю более точное ТЗ и код. Объясните дураку, что я делаю не так?
Код
function getList(){
  
  var list = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("список сайтов").getDataRange().getValues();
  return list;
}

function getData(){
  
  var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("данные").getDataRange().getValues();
  return data;
}

function main(){
var listArray = getList();
var dataArray = getData();

var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("данные");
var listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("список сайтов");

for (var i=1;i<dataArray.length;i++) {
  Logger.log("Цикл 1: " + "итерация " + i);
  for (var j=1;j<listArray.length;j++) {
  	if (dataArray[i][0] === listArray[j][0]) {
      if (listArray[j][3] === '')
        listSheet.getRange("B1:D13").setValue(dataArray[i][1]);
        Logger.log("Цикл2: " + "записано " + dataArray[i][1]);
      }
        if (listArray[j][5] === ''){
          listSheet.getRange("F13").setValue(dataArray[i][2]);
        }
      }
      break;
    }
  }

ТЗ

У меня есть 2 вкладки - “список сайтов”, “данные" 

2. В “список сайтов” собраны сайты с информацией, а на вкладке “данные” я буду заносить список нужных мне сайтов с данными 

3. Основные функции скрипта это перенос данных с вкладки “данные” во вкладку “список сайтов”: 

◦ Скрипт должен изначально брать с вкладки “данные” со 2-й ячейки столбца А доменное имя 

◦ Проверить этот домен во вкладке “список сайтов” в столбце А 

▪ Если находит этот домен, то проверяет есть ли там данные в столбцах email, feedback. Если есть, то переходит к следующему домену. Если нету, то вносит данные с вкладки “данные” с соответствующий строки. Плюс добавляет дату добавления и имя менеджера в соответствующие столбцы. 

▪ Если не находит этот домен, то записывает его в конец таблицы во вкладке “список сайтов” в столбец А. Возвращается во вкладку “данные” и проверяет есть ли записи в столбцах B, C в соответствующей строке. Если данные есть то скрипт переносит с вкладки “данные” со столбцов email, feedback во вкладку “список сайтов” в строку, где только что был добавлен домен и заполняет ячейку в столбце email/feedback соответственно. 

4. Когда скрипт проверил все домены, появляется сообщение о том что домены закончились и проверка соответственно тоже закончились.

  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Вам необходимо строить индекс по принципу баз данных, иначе в циклах все будет очень сложно.

function main() {
  var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
    'данные'
  );
  var dataArray = dataSheet.getDataRange().getValues();
  var listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
    'список сайтов'
  );
  var listArray = listSheet.getDataRange().getValues();
  // Строим индекс
  var listIndex = listArray.map(function(r){
    return r[0];
  });
  for (var j = 1; j < dataArray.length; j++) {
    if(dataArray[j][0] === '') continue;
    var pos = listIndex.indexOf(dataArray[j][0]);
    if (pos >= 0) {
      // Обновляем
      listSheet.getRange(pos + 1, dataArray[j].length + 1).setValue(new Date());
    } else {
      // Добавляем
      listSheet.appendRow([].concat(dataArray[j], new Date()));
    }
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы