Google स्क्रिप्ट में URL पैरामीटर के साथ कॉलम Google शीट में डेटा कैसे फ़िल्टर करें?

Nov 23 2020

मैं Google स्क्रिप्ट की कोशिश कर रहा हूं और मैं कीवर्ड मापदंडों के आधार पर डेटा प्रदर्शित करना चाहता हूं जो बाद में कॉलम सी को डेटा फ़िल्टर के रूप में संदर्भित करेगा जो पैरामीटर कीवर्ड में खोजे गए के अनुसार प्रदर्शित किया जाएगा।

उदाहरण के लिए मेरी पिछली परियोजना में मेरे पास पेजिनेशन के रूप में एक पैरामीटर था

?page=1&limit=10

अब मेरे पास एक नई समस्या है जिसे हल करने के लिए खोज और पृष्ठांकन दोनों हैं, मुझे खोज के संदर्भ के रूप में कॉलम b है

?page=1&limit=10&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);
}

संपादित करें:

मेरा मतलब है कॉलम सी

हल के लिए संपादित करें:

मैं @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);
}

जवाब

2 Tanaike Nov 23 2020 at 07:51

मेरा लक्ष्य इस प्रकार है।

  • आप स्प्रेडशीट की शीट "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=1&limit=10&search=San Andreasआपकी स्क्रिप्ट में, मैं समझ गया कि आप वेब ऐप्स का उपयोग कर रहे हैं।
  • इस मामले में, इसका इस्तेमाल करने के लिए आवश्यक है San Andreasकी ?page=1&limit=10&search=San Andreasतरह 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);
}
  • इस मामले में, जब यह अनुरोध करता है https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas, San Andreasतो शीट "लिस्ट_फिल्म" के कॉलम "बी" से खोजा जाता है और पंक्तियों, जिनके साथ समान San Andreasहैं, वापस कर दिए जाते हैं।
    • यदि आप सहित मानों को पुनः प्राप्त करना चाहते हैं search, तो b.toString().includes(search)इसके बजाय कृपया उपयोग करें b == search

ध्यान दें:

  • जब आपने वेब ऐप्स की स्क्रिप्ट को संशोधित किया, तो कृपया वेब ऐप को नए संस्करण के रूप में फिर से तैयार करें। इसके द्वारा, नवीनतम स्क्रिप्ट वेब ऐप्स पर दिखाई देती है। कृपया इससे सावधान रहें।

  • हालांकि मैं कॉलम "बी" के मूल्यों के बारे में निश्चित नहीं हूं, यदि उपरोक्त स्क्रिप्ट आपके द्वारा अपेक्षित परिणाम नहीं था, तो कृपया इसे फिर से संशोधित sheet.getDataRange().getValues().filter(([,b]) => b == search)करने sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)और परीक्षण करने का प्रयास करें।

  • यदि आप कॉलम "बी" के बजाय अन्य कॉलम के साथ तुलना करना चाहते हैं, उदाहरण के लिए, जब आप searchकॉलम "सी" के साथ मूल्य की तुलना करना चाहते हैं , तो कृपया संशोधित 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);
}
  • यदि आप पहली शीर्ष लेख पंक्ति को निकालना चाहते हैं और उल्टे मानों को वापस करना चाहते हैं, तो कृपया 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);
      }