Имею решение для фильтрации по этот вопрос.
Это отлично работает со столбцом, содержащим строковые значения. Когда я пытаюсь отфильтровать столбец с числовыми значениями, это не сработает. Я предполагаю, что это потому, что .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(); Это удалось, поэтому я знаю, что проблема в этом.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); })
Это работает! Спасибо Танаике. Следующий вопрос: повлияет ли это на столбцы, не являющиеся числовыми? Я это проверил, и он тоже работает.
Или, если вы хотите использовать 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 Ваша рекомендация в вашем первом комментарии сработала. Я обновил свой вопрос, включив в него решение. Вы хотите отправить ответ, чтобы я мог выбрать его?
Спасибо за ответ. Я разместил это как ответ. Не могли бы вы это подтвердить?
Возможный дубликат Как фильтровать массив массивов



Как насчет этой модификации?
.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();}) преобразует число в строку, поэтому число используется как строка.Я могу подтвердить, что это работает как с числовыми, так и с строковыми данными. Хотя вопрос. Если я хочу найти слово «яблоко» в столбце, в котором есть такие фразы, как «Я ел яблоко», эта строка не вернется. Как я могу заставить его работать таким образом?
Кроме того, есть ли недостатки в использовании одного из них по сравнению с другим?
@Danilo Cuellar Спасибо за ваш ответ. Приносим извинения за неудобства. Несмотря на то, что я снова прочитал ваш вопрос, я не могу понять другие 2 проблемы из вашего ответа. Итак, чтобы правильно понять свои проблемы, можете ли вы предоставить образец ситуации, включая входные и выходные значения, которые вы хотите, в качестве нового вопроса? Таким образом, это поможет многим пользователям, включая меня, придумать решение. Я хочу решить ваши вопросы. Но причина, по которой я не могу понять других ваших двух проблем, - это мои плохие навыки. Мне очень жаль эту ситуацию.
как я могу отредактировать это для обработки чувствительности к регистру? Я использовал подход colValueArr.map(function(e){return e[0].toString();}), но он не учитывает, если он ищет «яблоко» в «Я съел яблоко».
Вот новый вопрос по запросу.
@DanCue Спасибо за ответ. Я видел это только сейчас. Ответ уже был опубликован. Думаю, ответ - хорошее решение.
Да, решение понравилось. Я собираюсь задать еще несколько вопросов о чем-то подобном. Надеюсь, кто-то с такими же требованиями наткнется на эти вопросы и сочтет их полезными.
Я только что провел тщательный обзор результатов, и он не возвращает всех ожидаемых значений. colValueArr имеет 943 значения, а visibleValueArr - 288. Предполагается, что он возвращает 655 значений colValueArr, которых нет в visibleValueArr. Возвращается только 467. Есть мысли, почему?
@DanCue Мне очень жаль, что я плохо знаю английский. Я не мог понять, что ты хочешь сделать. Можете ли вы предоставить более подробную информацию?
Думаю, я разобрался. У меня проблема с отсутствующими номерами. Теперь это решено. Спасибо.
@DanCue Спасибо за ответ. Мне жаль, что я не смог помочь.
Я думаю, что в отношении
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(), не могли бы вы предоставить образец электронной таблицы?