Как фильтровать данные в столбце Google Sheets с параметром URL в Google Script?

#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 like e.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».