Логические исключения / диапазоны различий в электронных таблицах Google - PullRequest
1 голос
/ 28 октября 2019

Я хочу получить логические (A - B) или (A \ B) в таблицах Google.

Итак, имея:

A: A

{1,2,3,4}

и

B: B

{2,3,5,6}

enter image description here

Итак, моя формула

=my_amazing_formula(A:A, B:B)

должно вернуться

{1,4}

(элементы А отсутствуют в B)

Вопрос

Как мне достичьэто?

Ответы [ 3 ]

2 голосов
/ 28 октября 2019

Поскольку в Google Apps Script пока нет такой структуры данных, как HashSet , решить эту проблему довольно сложно. Вы можете выбрать квадратичное решение, которое для каждого элемента в первом диапазоне будет перебирать весь второй, пытаясь найти «совпадение», чтобы отбросить его. Это будет выглядеть как решение @Cooper.

В качестве альтернативы, и учитывая, что объекты скрипта Google Apps сохраняют порядок вставки свойств, вы можете использовать следующий код, который теоретически должен давать лучшие результаты производительности (особенно для большихрабочие нагрузки).

function DIFFERENCE(range1, range2) {
  var o = {};
  for (var i=0; i<range1.length; i++) {
    for (var j=0; j<range1[0].length; j++) {
      if (!o[range1[i][j]])
        o[range1[i][j]] = true;
    }
  }

  for (var i=0; i<range2.length; i++) {
    for (var j=0; j<range2[0].length; j++) {
      if (o[range2[i][j]])
        o[range2[i][j]] = false;
    }
  }

  return Object.keys(o).filter(function f(key) { return o[key]; }).map(function(res) { return parseFloat(res) });
}

Эта функция предполагает, что вы имеете дело с числами. Если вы хотите, чтобы он также работал со строками, вы можете заменить последнюю строку кода следующим: return Object.keys(o).filter(function f(key) { return o[key]; });

Вы также можете увидеть пару примеров здесь:

enter image description here enter image description here

2 голосов
/ 29 октября 2019

Вы можете сделать это с помощью встроенной формулы:

=FILTER(A1:A4,ISNA(MATCH(A1:A4,B1:B4,0)))
=FILTER({1;2;3;4},ISNA(MATCH({1;2;3;4},{2;3;5;6},0)))
  • FILTER из A1: A4, где
  • A1: A4 ISN из A доступно вB1:B4
1 голос
/ 28 октября 2019

Если ваш вопрос касается массивов, попробуйте следующее:

function elementsOfANotPresentInB(a,b) {
  var a=a||[1,2,3,4];
  var b=b||[2,3,5,6];
  var c=[];
  a.forEach(function(e){if(b.indexOf(e)==-1){c.push(e);}});
  Logger.log(c);
  return c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...