Как отфильтровать строки на одном листе на основе значений ячеек, перечисленных на другом листе в скриптах приложения Google GAS - PullRequest
1 голос
/ 26 марта 2020

В моем исходном сообщении есть ответ от @The Master, но мне нужно было немного больше деталей, поэтому я редактирую его. Я надеюсь, что @ Master или кто-то может помочь.

В скриптах приложения Google у меня есть скрипт для фильтрации строк, в которых есть определенные пользователи транзакции (такие как DEOK645, JETH850, JOON409 и др. c .. .) и это количество дозировки больше 0. Пожалуйста, смотрите скрипт ниже. У меня вопрос, вместо того, чтобы перечислять значения DEOK645, JETH850 и т. Д. c ... в самом скрипте, есть ли способ указать эти значения на основе списка на другом листе? Например, я буду перечислять этих пользователей в отдельных строках в листе вызова «Персонал», поэтому вместо обновления кода каждый раз, когда мне нужно будет добавить или изменить, я могу просто go добавить лист «Персонал» и добавить или удалить значения в листе. Моя цель - иметь как отфильтрованный набор данных ("FilterValue), так и исключающий отфильтрованный набор данных (noFilteredValue). Если я смогу получить некоторые предложения, я был бы признателен! Спасибо за ваше время!

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('V1');
  var firstRow = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues();
  var C1 = firstRow[0].indexOf('TxnUser');
  var C2 = firstRow[0].indexOf('DispensedQuantity');
  var rangeVals = 
  sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues();
  
  var filteredRange = rangeVals.reduce(function(obj, val){
    if ((val[C1] === "DEOK645"|| val[C1] === "JETH850" || val[C1] === "JOON409"|| val[C1] === "THAM1452") && val[C2] > 0) {
    obj.filteredValue.push(val);
    } else { obj.noFilteredValue.push(val);}
  return obj;
  }, {filteredValue: [], noFilteredValue: []});
   // The above code works

   //I tried to adapt the solution from @The Master but it says "Set" is not defined but maybe that is simply due to my lack of proficiency. Here is what I have tried:
  
  var Personnel = ss.getSheetByName('Personnel');
  var PersonnelSet = new Set(Personnel.getDataRange().getValues().flat());
  var filteredRange = rangeVals.reduce(function(obj,val){
    if (!PersonnelSet.has(val)) {obj.filteredValue.push(val);
    } else {obj.noFilteredValue.push(val);}
    return obj;
  }, {filteredValue: [], noFilteredValue: []});
      

1 Ответ

2 голосов
/ 27 марта 2020

Использование Наборы :

const rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
const excludeSheet = ss.getSheetByName('Personnel');
const excludeSet = new Set(excludeSheet.getDataRange().getValues().flat());
const filteredRange = rangeVals.filter(function(row){
    return !excludeSet.has(row[C1])  && row[C2]>0
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...