Как отфильтровать двумерный массив, используя данные из другого одномерного массива — Javascript / Google Apps Script?

#javascript #arrays #google-apps-script #filtering

#javascript #массивы #google-apps-script #фильтрация

Вопрос:

Я все еще новичок в скриптах приложений и javascript, но чем больше я учусь, тем легче становится моя работа.

У меня есть одномерный массив (var shippingID) и двумерный массив (var shipDetailsArr). ShippingID действует как фильтр для первого столбца shipDetailsArr. Я хочу вернуть все столбцы shipDetailsArr, где первый столбец равен ТОЛЬКО любой из ячеек из ShippingID. Как я могу сделать это в редакторе сценариев в app scripts?

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

Спасибо за любые предложения!

Эрик

Комментарии:

1. Чао Эрик, не мог бы ты привести пример массивов и чего ты хочешь достичь? Было бы очень полезно.

2. Чао Джованни, вот пример двух массивов. Первый массив — это идентификатор отправки с несколькими отправлениями ibb.co/9vs385R Второй — это больший набор данных, который имеет идентификатор отправки в качестве первого столбца ibb.co/CmN2Rsw Я хочу создать новый массив, который возвращает 2-й набор данных только с идентификаторами доставки из первого набора. Надеюсь, это имеет смысл, и спасибо за вашу помощь. Эрик

3. @GiovanniEsposito Не думаю, что ваш ответ неверен. Этого более чем достаточно для того, что запрашивает OP

4. @EricJohnson Предоставьте свой текущий код

Ответ №1:

Чао, предположим, что у вас есть shippingID набор строк и shipDetailsArr это 2D массив, с javascript вы могли бы использовать filter функцию таким образом:

 let shippingID = ["20-05-01-SHEN-EU", "20-05-01-SHEN-CAN"];
        let shipDetailsArr = [["20-05-01-SHEN-EU", "PJ0201", "CE-12-SLOT-WOOD-WATCH-DARK"],
        ["20-05-01-SHEN-CAN", "PJ0201", "CE-12-SLOT-WOOD-WATCH-DARK"], 
        ["20-05-01-SHEN-US", "PJ0201", "CE-12-SLOT-WOOD-WATCH-DARK"]];

        let result = shipDetailsArr.filter(det => shippingID.includes(det[0]));

        console.log(result);  

Как вы можете видеть из результата, я отфильтровал, shipDetailsArr используя shippingID.includes(det[0]) . Это возвращает только shipDetailsArr с shipmentID присутствующим в shippingID массиве.

Комментарии:

1. Хотя это может быть решение на javascript, я не думаю, что оно является допустимым. Op указал, что у него есть список фильтров из определенного файла электронной таблицы. А именно, он хочет извлечь этот список оттуда и работать с файлами электронных таблиц.

2. Если вы посмотрите теги вопросов, я не могу найти «электронную таблицу». Но я вижу «javascript»…

3. Но shipDetailsArr это 2D массив, как написано в сообщении. Фрагменты и решения JavaScript в порядке .. но op не упомянул массив объектов json. Это просто 2D массив. [[rowdata],[rowdata]] … как [[a1,b1,c1],[a2,b2,c2]]

4. @TheMaster теперь должно быть правильным 🙂 Нет проблем, ваше наблюдение верно

5. Все еще не думаю, что op примет ваш. Поскольку все массивы из sheet являются 2D: у меня есть одномерный массив (var shippingID) , вероятно, неправильный, если только он не использовал flat () для первого. Ответ действителен для заданного вопроса. Было бы лучше избегать ответов на вопросы без кода.

Ответ №2:

 function getDetailsForAnId(id='1') {//default used for testing
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('All Data');
  const vs=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn()).getValues();
  var oA=[];
  oA.push([id].concat(new Array(sh.getLastColumn()-1)));//display id only on first line of each section
  vs.forEach(function(r){
    if(r[0]==id) {
      let t=r.slice();
      t[0]='';//remove unnecessary id in output only for clarity
      oA.push(t);
    }
  });
  if(oA) {
    //console.log(oA);
    return oA;
  };
}

function loopThruIdsAndDisplayOnOutputSheet() {
  const ss=SpreadsheetApp.getActive();
  const osh=ss.getSheetByName('OutputSheet');
  osh.clearContents();//clear output sheet when starting
  const sh=ss.getSheetByName('Filter Data');
  const ids=sh.getRange(2,1,sh.getLastRow()-1,1).getValues();
  ids.forEach(function(id){
    let rows=getDetailsForAnId(id);
    if(rows) {
      osh.getRange(osh.getLastRow() 1,1,rows.length,rows[0].length).setValues(rows);
    }
  });
}
  

Все данные (csv):

 COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10,COL11,COL12,COL13,COL14,COL15,COL16,COL17,COL18,COL19,COL20,COL21,COL22,COL23,COL24,COL25,COL26
1,0,14,6,0,19,6,24,22,6,4,17,7,15,4,3,16,5,9,8,20,2,9,15,24,12
2,22,15,3,19,22,23,12,9,14,15,7,0,13,8,20,12,20,4,19,18,9,3,3,2,13
3,23,8,20,9,13,19,10,18,24,23,0,17,16,9,9,12,1,24,1,23,6,11,13,3,10
1,11,6,17,0,17,12,12,4,5,6,10,24,22,21,17,11,17,20,18,1,20,7,18,21,9
2,17,12,5,8,24,10,14,13,15,23,21,20,17,9,20,3,16,11,21,23,1,6,23,18,24
3,22,8,24,2,12,22,6,1,5,1,6,2,20,22,1,7,24,23,6,15,19,15,16,19,21
1,3,21,18,24,9,19,3,23,3,10,23,7,14,16,10,7,0,9,14,20,20,15,16,11,11
2,15,13,23,2,11,14,2,6,24,3,16,18,10,10,8,4,1,4,11,7,10,18,17,7,11
3,22,17,19,8,2,13,3,3,21,19,19,3,14,2,11,5,8,22,6,5,1,13,3,4,18
1,13,13,8,22,6,18,14,8,10,1,24,23,12,21,8,19,11,0,4,23,3,22,20,5,5
2,16,16,18,13,9,15,18,12,23,20,17,13,17,8,1,5,5,11,23,12,12,11,21,21,17
3,2,4,17,10,5,18,4,11,7,4,15,1,0,2,11,15,13,20,10,14,22,12,16,12,9
1,12,0,21,2,17,5,1,17,1,12,9,5,9,8,5,18,20,19,14,22,23,11,6,23,7
2,16,2,16,1,9,15,4,20,22,2,19,9,14,10,2,8,6,12,6,15,7,17,21,20,20
3,22,9,16,9,22,10,1,18,16,19,21,13,16,16,18,20,15,5,2,9,16,21,14,7,6
1,20,19,23,18,13,10,13,16,9,23,11,15,20,0,8,18,1,19,2,1,7,7,16,16,11
2,3,12,7,5,6,5,24,19,12,5,20,5,11,10,13,8,1,22,12,16,16,10,8,1,6
3,6,18,18,23,13,22,8,22,4,8,24,2,2,20,13,12,21,12,19,0,1,21,0,24,11
1,15,23,9,1,15,14,5,2,7,0,8,5,6,15,15,10,20,17,9,17,23,17,10,10,11
2,18,22,17,8,9,23,24,0,23,10,10,9,18,10,10,24,16,22,11,11,3,14,9,3,9
3,15,15,17,20,13,12,5,4,21,2,10,10,16,13,19,12,7,2,6,14,13,8,10,16,19
1,12,2,8,11,1,8,24,4,11,19,4,20,20,1,10,22,17,15,7,15,18,24,14,1,21
2,9,9,23,9,11,9,12,15,13,17,14,15,16,13,3,3,15,15,6,2,2,1,18,13,24
3,24,4,23,8,15,1,10,8,7,13,4,19,15,13,23,23,4,20,3,5,11,5,10,7,8
1,3,20,12,4,19,0,20,12,18,1,1,1,10,8,21,18,6,20,15,0,2,4,23,5,22
  

Фильтровать данные (csv):

 HDR1
1
2
3
  

Таблица выходных данных (csv):

 1,,,,,,,,,,,,,,,,,,,,,,,,,
,0,14,6,0,19,6,24,22,6,4,17,7,15,4,3,16,5,9,8,20,2,9,15,24,12
,11,6,17,0,17,12,12,4,5,6,10,24,22,21,17,11,17,20,18,1,20,7,18,21,9
,3,21,18,24,9,19,3,23,3,10,23,7,14,16,10,7,0,9,14,20,20,15,16,11,11
,13,13,8,22,6,18,14,8,10,1,24,23,12,21,8,19,11,0,4,23,3,22,20,5,5
,12,0,21,2,17,5,1,17,1,12,9,5,9,8,5,18,20,19,14,22,23,11,6,23,7
,20,19,23,18,13,10,13,16,9,23,11,15,20,0,8,18,1,19,2,1,7,7,16,16,11
,15,23,9,1,15,14,5,2,7,0,8,5,6,15,15,10,20,17,9,17,23,17,10,10,11
,12,2,8,11,1,8,24,4,11,19,4,20,20,1,10,22,17,15,7,15,18,24,14,1,21
,3,20,12,4,19,0,20,12,18,1,1,1,10,8,21,18,6,20,15,0,2,4,23,5,22
2,,,,,,,,,,,,,,,,,,,,,,,,,
,22,15,3,19,22,23,12,9,14,15,7,0,13,8,20,12,20,4,19,18,9,3,3,2,13
,17,12,5,8,24,10,14,13,15,23,21,20,17,9,20,3,16,11,21,23,1,6,23,18,24
,15,13,23,2,11,14,2,6,24,3,16,18,10,10,8,4,1,4,11,7,10,18,17,7,11
,16,16,18,13,9,15,18,12,23,20,17,13,17,8,1,5,5,11,23,12,12,11,21,21,17
,16,2,16,1,9,15,4,20,22,2,19,9,14,10,2,8,6,12,6,15,7,17,21,20,20
,3,12,7,5,6,5,24,19,12,5,20,5,11,10,13,8,1,22,12,16,16,10,8,1,6
,18,22,17,8,9,23,24,0,23,10,10,9,18,10,10,24,16,22,11,11,3,14,9,3,9
,9,9,23,9,11,9,12,15,13,17,14,15,16,13,3,3,15,15,6,2,2,1,18,13,24
3,,,,,,,,,,,,,,,,,,,,,,,,,
,23,8,20,9,13,19,10,18,24,23,0,17,16,9,9,12,1,24,1,23,6,11,13,3,10
,22,8,24,2,12,22,6,1,5,1,6,2,20,22,1,7,24,23,6,15,19,15,16,19,21
,22,17,19,8,2,13,3,3,21,19,19,3,14,2,11,5,8,22,6,5,1,13,3,4,18
,2,4,17,10,5,18,4,11,7,4,15,1,0,2,11,15,13,20,10,14,22,12,16,12,9
,22,9,16,9,22,10,1,18,16,19,21,13,16,16,18,20,15,5,2,9,16,21,14,7,6
,6,18,18,23,13,22,8,22,4,8,24,2,2,20,13,12,21,12,19,0,1,21,0,24,11
,15,15,17,20,13,12,5,4,21,2,10,10,16,13,19,12,7,2,6,14,13,8,10,16,19
,24,4,23,8,15,1,10,8,7,13,4,19,15,13,23,23,4,20,3,5,11,5,10,7,8|
  

Изображение выходного листа:

введите описание изображения здесь

Кстати, в вашем вопросе задается вопрос о том, как отфильтровать 2D-массив с помощью 1D-массива. Вы должны знать, что оба они являются 2D-массивами. Один столбец по-прежнему является 2D-массивом.

Ответ №3:

Решение:

Используйте следующий код:

 function filter2D() {
  
  const ss = SpreadsheetApp.getActive();
  
  const dsh = ss.getSheetByName('All Data');
  const data = dsh.getRange('A1:G20').getValues();
  const fsh = ss.getSheetByName('Filter Data');
  const filterList = fsh.getRange('A2:A13').getValues().flat([1]);
  const osh = ss.getSheetByName('Output Data');
  
  const f_data = data.filter(function (row) {
    return filterList.includes(row[0]);
  }); 
  osh.getRange(1,1,f_data.length,f_data[0].length).setValues(f_data);
}
  

Обратите внимание, что вы можете изменять диапазоны как для Filter Data , так и для All Data в соответствии с вашими потребностями. Я также использую третий лист с именем Output Data для хранения отфильтрованных данных.


Другой пример:

Вот пример того, как вы можете отфильтровать двумерный массив на основе значений одномерного массива:

 function filter2D() {
  
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  const data = sh.getRange('A1:D18').getValues();
  const filterList = sh.getRange('F1:F2').getValues().flat([1]);
  
  const f_data = data.filter(function (row) {
    return filterList.includes(row[0]);
  }); 
  sh.getRange(24,1,f_data.length,f_data[0].length).setValues(f_data);
}
  

Объяснение:

Вы будете использовать функцию filter() для поиска строк в 2D-массиве, data которые удовлетворяют определенному условию. То есть первый столбец ( row[0] ) должен содержать значения из filterList . Чтобы проверить, происходит ли это, вы можете использовать includes(). Затем я сохраняю отфильтрованные данные f_data обратно на лист. Конечно, это просто для иллюстрации. Не стесняйтесь адаптировать этот код к вашим потребностям.

Ввод и вывод электронных таблиц:

Пример