簡體   English   中英

如何通過應用程序腳本從谷歌表中獲取特定范圍的行數據

[英]How to get the specific range of row data from google sheet through apps script

我正在嘗試通過應用腳本從谷歌表中獲取一些數據范圍。
讓我們舉個例子。 我在谷歌表中有 96 行數據,我想獲取 10 行。
從前端調用基於滾動事件來獲取每下 10 行數據。
我試過下面的代碼。

function doGet(request){
  var ss = SpreadsheetApp.openById("MY SHEET ID");
  var sheet = ss.getSheetByName("Products");
  return getUsers(sheet,request); 
}

function getUsers(sheet,request){
  var jo = {};
  var dataArray = [];
  // every time from, where is passed from Frontend, like 2-10, 12-10, 22-10, etc...
  var from = request.parameter.from;
  var where = request.parameter.where;
  // by this if condition, getting data from 1 to 90
  if((sheet.getLastRow()-1)>=(from+where)){
    var rows = sheet.getRange(from,1,from+where, sheet.getLastColumn()).getValues();
    for(var i = 0, l= rows.length; i<l ; i++){
      var dataRow = rows[i];
      var record = {};
      record['ProductId'] = dataRow[0];
      // ...
      // some more column data fetching here
      // ...
      dataArray.push(record);
    }  
    jo.user = dataArray;
    var result = JSON.stringify(jo);
    return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
  }
  // tried to get last 6 data through below code
  else{
    if(from <= (sheet.getLastRow() - 1)){
      var rows = sheet.getRange(from,1,sheet.getLastRow()-1, sheet.getLastColumn()).getValues();
      for(var i = 0, l= rows.length; i<l ; i++){
        var dataRow = rows[i];
        var record = {};
        record['ProductId'] = dataRow[0];
        // ...
        // some more column data fetching here
        // ...
        dataArray.push(record);
      }  
      jo.user = dataArray;
      var result = JSON.stringify(jo);
      return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
    }
  }
}  

通過這段代碼,我用 10 行的塊獲得了高達 90 的值,但最后,我無法獲得最后 6 個數據。
有什么邏輯可以獲取這些記錄嗎? 我試圖通過最后一個if語句來實現,但無法獲得。
提前致謝!

編輯:
根據Taniake的解決方案,完美獲取 ProductId 列,
此外,如果有多個列,如 ProductId、ProductName、ProductImage 等。
范圍可能是

const values = sheet.getRange(from, 1, sheet.getLastRow() - from - where >= 0 ? where : sheet.getLastRow() - from + 1, 1).getValues();


const values = sheet.getRange(from, 1, sheet.getLastRow() - from - where >= 0 ? where : sheet.getLastRow() - from + 1, sheet.getLastColumn()).getValues();

如何在提供的解決方案中將 map 的這些值轉換為 JSON 常數,即“結果”?

我認為在您的情況下,可能需要修改檢索到的值。 那么下面的修改呢? 在您的腳本中,值是從“A”列中檢索的。 所以,這也反映到修改后的腳本上。

修改后的腳本:

當您的腳本被修改時,請進行如下修改。

從:
 var rows = sheet.getRange(from,1,from+where, sheet.getLastColumn()).getValues();
至:
 var rows = sheet.getRange(from, 1, where, 1).getValues();

從:
 var rows = sheet.getRange(from,1,sheet.getLastRow()-1, sheet.getLastColumn()).getValues();
至:
 var rows = sheet.getRange(from, 1, sheet.getLastRow() - from + 1, 1).getValues();

或者,作為其他模式,以下示例腳本怎么樣?

示例腳本 1:

在此示例中,您的getUsers已修改。 在此模式中,范圍會更改為fromwhere ,並且從特定范圍中檢索值。

 function getUsers(sheet,request){ var from = request.parameter.from; var where = request.parameter.where; const values = sheet.getRange(from, 1, sheet.getLastRow() - from - where >= 0? where: sheet.getLastRow() - from + 1, 1).getValues(); const result = JSON.stringify({user: values.map(([a]) => ({ProductId: a}))}); return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON); }

示例腳本 2:

在此示例中,您的getUsers已修改。 在此模式中,檢索列“A”的所有值,並使用splice檢索特定值。 在這種情況下,可以直接使用fromwhere 我認為這可能與弗蘭克的評論相同。

const values = sheet.getRange(from, 1, sheet.getLastRow() - from - where >= 0 ? where : sheet.getLastRow() - from + 1, 1).getValues();
const result = JSON.stringify({user: values.map(([a]) => ({ProductId: a}))});

筆記:

  • 當您修改腳本時,請將 Web 應用程序重新部署為新版本。 這樣,最新的腳本就會反映到 Web 應用程序中。 請注意這一點。

參考:

添加:

當列是“ProductId”、“ProductName”和“ProductImage”等 3 列時,示例腳本 1 和 2 如下所示。

從:

 const values = sheet.getRange(from, 1, sheet.getLastRow() - from - where >= 0? where: sheet.getLastRow() - from + 1, 1).getValues(); const result = JSON.stringify({user: values.map(([a]) => ({ProductId: a}))});

至:

 const values = sheet.getRange(from, 1, sheet.getLastRow() - from - where >= 0? where: sheet.getLastRow() - from + 1, sheet.getLastColumn()).getValues(); const result = JSON.stringify({user: values.map(([a,b,c]) => ({ProductId: a: ProductName: b, ProductImage: c}))});

或者

從:

 const values = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues().splice(from, where); const result = JSON.stringify({user: values.map(([a]) => ({ProductId: a}))});

至:

 const values = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues().splice(from, where); const result = JSON.stringify({user: values.map(([a,b,c]) => ({ProductId: a: ProductName: b, ProductImage: c}))});
  • 當你想擴展這個時,請將[a,b,c]修改為[a,b,c,d,e,f,,,]{ProductId: a: ProductName: b, ProductImage: c}{ProductId: a: ProductName: b, ProductImage: c, key1: d, key2: e, key3: f}

這是重構的開始。 一些我不明白的事情需要澄清:

  1. 你為什么from where添加循環? 如果我設置from=10; where=20 from=10; where=20 ,我從 10 到 39 得到結果。我猜這不是你想要的。
  2. 顯然,您需要清除 myfunc 的默認值。
function doGet(request)
{
  return myfunc(request.parameter.from, request.parameter.where);
}

function myfunc(from=10, where=20){
  let sheet = SpreadsheetApp.openById("1CP1n-B87RD_BfffrOKVemmbqQ4-rq3W5t59x90tX0VA").getSheetByName("Products");
  var jo = {user:[]};

  const rawdata = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
  const data = rawdata.slice(from, where);
  
  data.map((row, idx, arr)=>{
     let record = {};
     record['ProductId'] = row[0];
     jo.user.push(record);
  });

  return JSON.stringify(jo);
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM