#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
Я пытаюсь использовать Google Script и хочу отображать данные на основе параметров ключевого слова, которые позже будут ссылаться на столбец C в качестве фильтра данных, который будет отображаться в соответствии с тем, что ищется в ключевом слове параметра.
Например, в моем предыдущем проекте у меня был параметр в качестве разбивки на страницы
?page=1amp;limit=10
что ж, теперь у меня есть новая проблема, которую нужно решить, это поиск и разбивка на страницы, у меня есть столбец b в качестве ссылки для поиска
?page=1amp;limit=10amp;search=San Andreas
Как мне реализовать приведенный ниже код?
function doGet(e) {
var page = e.parameter.page || 1;
var limit = e.parameter.limit || 10;
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
var sheet = ss.getSheetByName("list_film");
return getUsers(sheet, page, limit);
}
function getUsers(sheet, page, limit){
var rows = sheet.getDataRange().getValues();
var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
var jo = {};
jo.user = dataArray;
var result = JSON.stringify(jo);
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
Редактировать:
Я имею в виду столбец C
Редактировать для решения:
Я хочу сказать спасибо @Tanaike, который так мне помог!
Вот мой окончательный код
function doGet(e) {
var page = e.parameter.page || 1;
var limit = e.parameter.limit || 10;
var search = e.parameter.search || "";
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
var sheet = ss.getSheetByName("list_film");
return getUsers(sheet, page, limit, search);
}
function getUsers(sheet, page, limit, search){
var lowCase = search.toString().toLowerCase();
var rows = sheet.getDataRange().getValues().filter(([,,c]) => c.toString().toLowerCase().includes(lowCase));
var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
var jo = {};
jo.user = dataArray;
var result = JSON.stringify(jo);
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Вы хотите получить значения из листа «list_film» электронной таблицы
SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111")
. - Вы хотите получить значения путем поиска значения
search
из столбца «B».
Точки изменения:
- Из
e.parameter.page
e.parameter.limit
и?page=1amp;limit=10amp;search=San Andreas
в вашем сценарии я понял, что вы используете веб-приложения. - В этом случае требуется использовать
San Andreas
?page=1amp;limit=10amp;search=San Andreas
likee.parameter.search
. - Я хотел бы предложить внести изменения
sheet.getDataRange().getValues()
getUsers
, добавивfilter
. Это похоже наsheet.getDataRange().getValues().filter(([,b]) => b == search)
Когда вышеуказанные пункты будут отражены в вашем скрипте, это будет выглядеть следующим образом.
Измененный сценарий:
var page = e.parameter.page || 1;
var limit = e.parameter.limit || 10;
var search = e.parameter.search || "";
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
var sheet = ss.getSheetByName("list_film");
return getUsers(sheet, page, limit, search);
}
function getUsers(sheet, page, limit, search){
var rows = sheet.getDataRange().getValues().filter(([,b]) => b == search);
var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
var jo = {};
jo.user = dataArray;
var result = JSON.stringify(jo);
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
- В этом случае, когда он запрашивает to
https://script.google.com/macros/s/###/exec?page=1amp;limit=10amp;search=San Andreas
,San Andreas
выполняется поиск из столбца «B» листа «list_film» и возвращаются строки, совпадающие сSan Andreas
.- Если вы хотите получить значения, в том числе
search
, пожалуйста, используйтеb.toString().includes(search)
вместоb == search
.
- Если вы хотите получить значения, в том числе
Примечание:
- Когда вы изменили сценарий веб-приложений, пожалуйста, повторно разверните веб-приложения как новую версию. Таким образом, последний сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны с этим.
- Хотя я не уверен в значениях столбца «B», если приведенный выше сценарий не дал ожидаемого результата, попробуйте изменить
sheet.getDataRange().getValues().filter(([,b]) => b == search)
sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)
и протестировать его снова. - Если вы хотите сравнить с другим столбцом вместо столбца «B», например, когда вы хотите сравнить значение
search
со столбцом «C», пожалуйста, изменитеfilter(([,b]) => b == search)
наfilter(([,,c]) => c == search)
.
Ссылки:
Добавлено:
Точки изменения:
- Из вашего
my last code
следующего было обнаружено, что мой предложенный сценарий использовался неправильно.function doGet(e) { var page = e.parameter.page || 1; var limit = e.parameter.limit || 10; var search = e.parameter.search || ""; var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111"); var sheet = ss.getSheetByName("list_film"); return getUsers(sheet, page, limit, search); } function getUsers(sheet, page, limit, search){ var rows = sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search); var rows = sheet.getDataRange().getValues().slice(1); var rows = sheet.getDataRange().getValues().reverse(); var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []); var jo = {}; jo.user = dataArray; var result = JSON.stringify(jo); return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON); }
- При
var rows = sheet.getDataRange().getValues().slice(1);
иvar rows = sheet.getDataRange().getValues().reverse();
значения извлекаются с помощьюsheet.getDataRange().getValues()
. При этом значения не фильтруются. Я думаю, что это причина вашей текущей проблемы.
Когда ваш текущий скрипт изменяется, он становится следующим.
Измененный сценарий:
function doGet(e) {
var page = e.parameter.page || 1;
var limit = e.parameter.limit || 10;
var search = e.parameter.search || "";
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
var sheet = ss.getSheetByName("list_film");
return getUsers(sheet, page, limit, search);
}
function getUsers(sheet, page, limit, search){
var rows = sheet.getDataRange().getDisplayValues().filter(([,,c]) => c == search);
var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
var jo = {};
jo.user = dataArray;
var result = JSON.stringify(jo);
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
- Если вы хотите удалить 1-ю строку заголовка и вернуть обратные значения, пожалуйста, измените функцию
getUsers
следующим образом.function getUsers(sheet, page, limit, search){ var rows = sheet.getDataRange().getValues().slice(1).filter(([,,c]) => c == search).reverse(); var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []); var jo = {}; jo.user = dataArray; var result = JSON.stringify(jo); return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON); }
Комментарии:
1. Спасибо за помощь, но отображаемые данные те же и не фильтруют данные столбца B на основе ключевых слов в параметрах. Я также все еще пытаюсь решить эту проблему, но безрезультатно: (
2. @T6VK Спасибо за ответ. Приношу извинения за неудобства. В этом случае я хотел бы подтвердить вашу текущую ситуацию, проверив образец электронной таблицы на предмет повторения вашей проблемы. Потому что в моей среде, когда я тестировал скрипт с использованием образца электронной таблицы, возвращаемое значение может быть отфильтровано по столбцу «B» с
search
помощью . К сожалению, я не могу воспроизвести вашу ситуацию. Я глубоко извиняюсь за свое плохое мастерство. Итак, можете ли вы предоставить образец электронной таблицы, включая ваш текущий сценарий, для воспроизведения вашей проблемы? Этим я хотел бы подтвердить это.3. @T6VK я подтвердил, что ваш вопрос был изменен сейчас. Я приношу свои извинения за это. В вашем 1-м вопросе вы хотели использовать столбец «B» в качестве столбца поиска. Но в вашем обновленном вы хотите использовать столбец «C». В таком случае я должен извиниться за свое плохое знание английского. Я уже написал пункт модификации в 3-м варианте раздела «Примечание». Если вы не можете понять этого, пожалуйста, скажите мне. Если это изменение не было прямым решением вашей текущей проблемы, можете ли вы предоставить образец электронной таблицы для воспроизведения вашей проблемы? Этим я хотел бы подтвердить это.
4. @T6VK В качестве важного момента, когда вы изменили сценарий веб-приложений, пожалуйста, повторно разверните веб-приложения как новую версию. Таким образом, последний сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны с этим.
5. @T6VK Спасибо, что ответили. В моей среде я протестировал скрипт, используя электронную таблицу, в которой есть «sample1», «sample2»,,, в столбце «C». В этом случае, когда
?page=1amp;limit=10amp;search=sample1
используется, извлекается строка, включающая «sample1» в столбце «C».