我正在尝试通过应用脚本从谷歌表格中获取一些数据。
让我们举个例子。我在 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
已被修改。在此模式中,from
和 where
的范围发生变化,并且从特定范围中检索值。
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 检索特定值。这种情况下可以直接使用from
和where
。我认为这可能与 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/