google-apps-script - 如何通过apps脚本从googlesheet获取特定范围的行数据

标签 google-apps-script google-sheets pagination

我正在尝试通过应用脚本从谷歌表格中获取一些数据。
让我们举个例子。我在 Google Sheet 中有 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);
    }
  }
}  

通过这段代码,我得到的值高达 90,包含 10 行的数据 block ,但最后我无法获取最后 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();

如何将这些值映射到 JSON 常量,即提供的解决方案中的“结果”?

最佳答案

我认为在您的情况下,可能需要修改检索到的值。那么下面的修改如何呢?在您的脚本中,从“A”列中检索值。因此,这也反射(reflect)到修改后的脚本中。

修改后的脚本:

当您的脚本修改时,请进行如下修改。

从:
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。我认为这可能与 Frank's comment 相同的流程.

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

注意:

  • 修改脚本后,请将 Web 应用程序重新部署为新版本。这样,最新的脚本就会反射(reflect)到Web Apps中。请小心这一点。

引用文献:

添加:

当列为“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}

关于google-apps-script - 如何通过apps脚本从googlesheet获取特定范围的行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588162/

相关文章:

regex - 使用 Google App 脚本将表格中的电话号码格式从 1xxxxxxxxxx 到 xxx-xxx-xxxx

pdf - 导出为 PDF 时更改文档方向

r - 使用 googlesheets4 通过 Shiny 应用程序授权非交互式使用 googlesheets

javascript - 自定义函数停止工作

php - Laravel 5 分页尾部斜杠重定向到 301

javascript - 从 Google Drive 获取基于脚本的网页的图像

google-apps-script - 如何在 toast() 中显示换行符/CR?

javascript - 无法通过 Google 脚本更改数字单元格的值

javascript - JQuery .click 函数不适用于包含的 <a> 标签

php - 每页用户显示的分页问题