我有一个查询谷歌工作表,它正在按我预期工作。 我使用 Postman 进行测试,因为在我的应用程序(桌面应用程序(中,我无法使用 Google 提供的任何 SDK。 这不是一个网络应用程序,所以我甚至不能使用托管在谷歌CDN上的Javascript源代码。 无论如何,我正在查询一个包含许多行的电子表格,其中包含我正在查询的特定列:
在通过 OAuth2 方法检索身份验证令牌后,我正在使用以下端点:
https://docs.google.com/a/google.com/spreadsheets/d/{{sheet_key}}/gviz/tq?sheet={{tab_name}}&tq={{sheet_query}}
Postman 中正确处理 URL 编码的 {{sheet_query}} 变量设置为以下内容:
select * where C = 'ready'
我的特定工作表的响应是我所期望的,并且数据是正确的。 工作表中有三行,其中 C 列设置为"就绪",这很棒。
现在,对此 GET 请求的响应似乎不会发回检索到的行的序号行索引,它只是发送行的数据。 问题是我想通过 Google 表格 API v4 写回这些行,它现在使用 A1 表示法作为定位要更新的单元格范围的方法。
问题在于,为了写回通过我的可视化 API 请求检索到的这些行,我需要这些行的序号索引来请求到 Google 表格 API。 有没有办法从请求中的工作表获取每一行的序号索引到可视化 API 调用?
我找到了这个堆栈溢出线程,但我不确定这是否可以在我的情况下工作,因为我本质上是在手动构建请求并且没有 SDK。 我也没有使用Google Apps Script,而是使用可视化API。 我能想到的唯一解决方法是强制最终用户确保要查询的工作表具有其单元格具有=ROW()
公式的列,但我宁愿不将其作为用户方面的要求。
任何见解或指导不胜感激。
- 您希望通过在 Google 电子表格中搜索工作表中的值来检索行号。
- 您希望使用Google Apps Script实现此目的。
我可以像上面一样理解。如果我的理解是正确的,那么这个答案呢?请将此视为几种可能的答案之一。
流:
- 检索工作表对象。 使用搜索值
- 在工作表中搜索值。
- 在这种情况下,我使用了TextFinder。
- 从搜索结果中检索行号。
示例脚本:
请将以下示例脚本复制粘贴到脚本编辑器中,并设置searchValue, spreadsheetId, sheetName
的变量。然后,作为测试运行,请运行testRun()
的功能。这样,行号将作为数组返回。
function getRowNumberBySearch(searchValue, spreadsheetId, sheetName) {
var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
var t = sheet.createTextFinder(searchValue).findAll();
return t.map(function(e) {return e.getRow()});
}
// Please run this function.
function testRun() {
var searchValue = "sample";
var spreadsheetId = "###";
var sheetName = "Sheet1";
var res = getRowNumberBySearch(searchValue, spreadsheetId, sheetName);
Logger.log(res)
}
引用:
- 类文本查找器
- 地图((
添加:
附加问题1:
示例脚本:有没有办法将
.findAll()
方法缩小到工作表中的特定范围,以便它专注于单列?
function getRowNumberBySearch(searchValue, spreadsheetId, sheetName, range) {
var range = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName).getRange(range);
var t = range.createTextFinder(searchValue).findAll();
return t.map(function(e) {return e.getRow()});
}
- 在本例中,
range
是 a1Notation。
附加问题2:
示例脚本:是否可以返回行的所有值,而不仅仅是它们的索引?
function getRowNumberBySearch(searchValue, spreadsheetId, sheetName, range) {
var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
var t = sheet.getRange(range).createTextFinder(searchValue).findAll();
return t.map(function(e) {return sheet.getRange(e.getRow(), 1, 1, sheet.getLastColumn()).getValues()[0]});
}
- 在本例中,
range
是 a1Notation。 - 我认为在这种情况下,也可以使用您问题的端点。