Применить фильтр к столбцу с числовыми значениями

Имею решение для фильтрации по этот вопрос.

Это отлично работает со столбцом, содержащим строковые значения. Когда я пытаюсь отфильтровать столбец с числовыми значениями, это не сработает. Я предполагаю, что это потому, что .setHiddenValues() не принимает числовые значения. Я могу ошибаться.

Позвольте мне объяснить свой сценарий:

Пользователь вводит значение в интерфейсе HTML, скажем, 6634. HTML вызывает мою функцию в .gs и передает числовое значение, введенное пользователем.

google.script.run                                                                            //Executes an Apps Script JS Function
 .withSuccessHandler(updateStatus)                                                           //function to be called upon successfull completion of Apps Script function
 .withFailureHandler(failStatus)
 .withUserObject(button)                                                                     //To pass the event element object
 .projectSearch2(projectID);           //Apps Script JS Function
return;

Функция (по связанному выше вопросу) примет это значение и сопоставит его со значениями в столбце, удалив значение, если оно будет найдено. У меня остался массив значений, которые я не хочу фильтровать.

function projectSearch2(projectID){
    var ss = SpreadsheetApp.getActive();
    var monthlyDetailSht = ss.getSheetByName('Data Sheet');
    var monLastCN = monthlyDetailSht.getLastColumn();
    var monLastRN = monthlyDetailSht.getLastRow();    
    var data = monthlyDetailSht.getRange(1,1,1,monLastCN).getValues();//Get 2D array of all values in row one
    var data = data[0];//Get the first and only inner array
    var projectIDCN = data.indexOf('Project Id') + 1;

    //Pull data from columns before filtering
    var projectIDData = monthlyDetailSht.getRange(2,projectIDCN,monLastRN,1).getValues();

    //Reset filters if filters exist
    if (monthlyDetailSht.getFilter() != null){monthlyDetailSht.getFilter().remove();}

    //Start Filtering
    var projectIDExclCriteria = getHiddenValueArray(projectTypeData,projectID); //get values except for    
    var rang = monthlyDetailSht.getDataRange();
    var projectIDFilter = SpreadsheetApp.newFilterCriteria().setHiddenValues(projectIDExclCriteria).build();//Create criteria with values you do not want included.
    var filter = rang.getFilter() || rang.createFilter();// getFilter already available or create  a new one

    if (projectID != '' && projectID != null){
      filter.setColumnFilterCriteria(projectIDCN, projectIDFilter);
    }


};

function getHiddenValueArray(colValueArr,visibleValueArr){
  var flatUniqArr = colValueArr.map(function(e){return e[0];})
  .filter(function(e,i,a){return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1); })
  return flatUniqArr;
}

Этот массив используется в .setHiddenValues() для фильтрации по столбцу. Однако ничего не фильтруется. Это работает для всех столбцов, содержащих строковые значения, но не для столбцов с числовыми значениями. На данный момент я потерялся.

Попытки решения:

  • Преобразуйте пользовательскую переменную в строку с помощью input = input.toString(). Не сработало.
  • вручную вставил .setHiddenValues для projectIDExclCriteria. Как это: var projectIDFilter = SpreadsheetApp.newFilterCriteria().setHiddenValues([1041,1070,1071,1072]).build(); Это удалось, поэтому я знаю, что проблема в этом.
  • Шаг перед вызовом getHiddenValueArray. Вручную вставил вот так: var projectIDExclCriteria = getHiddenValueArray(projectIDData,[6634]); Не работает. Проблема в том, что функция getHiddenValueArray неправильно обрабатывает числа?

Вот решение. Изменение следующего:

.filter(function(e,i,a){return (a.indexOf(e.toString())==i &&    visibleValueArr.indexOf(e.toString()) ==-1); })

К:

.filter(function(e,i,a){return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1); })  

Это работает! Спасибо Танаике. Следующий вопрос: повлияет ли это на столбцы, не являющиеся числовыми? Я это проверил, и он тоже работает.

Я думаю, что в отношении a.indexOf(e.toString()), если e - это номер, а e включен в a, a.indexOf(e.toString()) - это -1 от e.toString(). Так как насчет попытки модификации на return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1)? Но я не уверен в значениях деталей. Итак, если этот getHiddenValueArray() по-прежнему не работает, можете ли вы предоставить примерное значение «colValueArr» и «visibleValueArr», чтобы подтвердить вашу проблему? А если возникнет проблема с setColumnFilterCriteria(), не могли бы вы предоставить образец электронной таблицы?

Tanaike 01.08.2018 02:33

Или, если вы хотите использовать return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1), как насчет попытки перейти с colValueArr.map(function(e){return e[0];}) на colValueArr.map(function(e){return e[0].toString();})?

Tanaike 01.08.2018 02:38

@Tanaike Ваша рекомендация в вашем первом комментарии сработала. Я обновил свой вопрос, включив в него решение. Вы хотите отправить ответ, чтобы я мог выбрать его?

DanCue 01.08.2018 13:56

Спасибо за ответ. Я разместил это как ответ. Не могли бы вы это подтвердить?

Tanaike 02.08.2018 01:12

Возможный дубликат Как фильтровать массив массивов

Rubén 18.02.2019 19:20
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
5
659
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет этой модификации?

Из :

.filter(function(e,i,a){return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1); })

К :

.filter(function(e,i,a){return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1); }) 

Примечание :

  • В этой модификации число и строку можно сравнивать с использованием каждого значения.
  • Если вы хотите использовать return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1), вы можете добиться этого, перейдя с colValueArr.map(function(e){return e[0];}) на colValueArr.map(function(e){return e[0].toString();}).
    • В этой модификации colValueArr.map(function(e){return e[0].toString();}) преобразует число в строку, поэтому число используется как строка.

Справка :

Я могу подтвердить, что это работает как с числовыми, так и с строковыми данными. Хотя вопрос. Если я хочу найти слово «яблоко» в столбце, в котором есть такие фразы, как «Я ел яблоко», эта строка не вернется. Как я могу заставить его работать таким образом?

DanCue 02.08.2018 17:09

Кроме того, есть ли недостатки в использовании одного из них по сравнению с другим?

DanCue 02.08.2018 17:14

@Danilo Cuellar Спасибо за ваш ответ. Приносим извинения за неудобства. Несмотря на то, что я снова прочитал ваш вопрос, я не могу понять другие 2 проблемы из вашего ответа. Итак, чтобы правильно понять свои проблемы, можете ли вы предоставить образец ситуации, включая входные и выходные значения, которые вы хотите, в качестве нового вопроса? Таким образом, это поможет многим пользователям, включая меня, придумать решение. Я хочу решить ваши вопросы. Но причина, по которой я не могу понять других ваших двух проблем, - это мои плохие навыки. Мне очень жаль эту ситуацию.

Tanaike 03.08.2018 02:08

как я могу отредактировать это для обработки чувствительности к регистру? Я использовал подход colValueArr.map(function(e){return e[0].toString();}), но он не учитывает, если он ищет «яблоко» в «Я съел яблоко».

DanCue 03.08.2018 15:14

Вот новый вопрос по запросу.

DanCue 03.08.2018 15:41

@DanCue Спасибо за ответ. Я видел это только сейчас. Ответ уже был опубликован. Думаю, ответ - хорошее решение.

Tanaike 04.08.2018 01:25

Да, решение понравилось. Я собираюсь задать еще несколько вопросов о чем-то подобном. Надеюсь, кто-то с такими же требованиями наткнется на эти вопросы и сочтет их полезными.

DanCue 04.08.2018 01:31

Я только что провел тщательный обзор результатов, и он не возвращает всех ожидаемых значений. colValueArr имеет 943 значения, а visibleValueArr - 288. Предполагается, что он возвращает 655 значений colValueArr, которых нет в visibleValueArr. Возвращается только 467. Есть мысли, почему?

DanCue 10.08.2018 17:56

@DanCue Мне очень жаль, что я плохо знаю английский. Я не мог понять, что ты хочешь сделать. Можете ли вы предоставить более подробную информацию?

Tanaike 11.08.2018 01:19

Думаю, я разобрался. У меня проблема с отсутствующими номерами. Теперь это решено. Спасибо.

DanCue 11.08.2018 04:56

@DanCue Спасибо за ответ. Мне жаль, что я не смог помочь.

Tanaike 11.08.2018 08:21

Другие вопросы по теме