rest - 如何找到具有某些值的单元格的位置
问题描述
我需要在我的电子表格中找到包含一些数据的行并将其删除。我所知道的是行中单元格内的 id。
如何使用 google REST API 搜索单元格的位置
例如:
GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values:find?value=123456
response:
sheet1! B2:B2
另外: 我还想支持从一张纸到另一张纸的剪切和粘贴。所以将元数据放在行上是行不通的,因为在将单元格从行复制到另一行时它会丢失。(没有 REST API 可以将维度(行||列)从一张纸剪切并粘贴到另一张纸上。
如果有一种方法可以在工作表之间复制和粘贴尺寸,我可以简单地使用
POST https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter
{
"dataFilters": [
{
object (DataFilter)
}
],
"majorDimension": enum (Dimension),
"valueRenderOption": enum (ValueRenderOption),
"dateTimeRenderOption": enum (DateTimeRenderOption)
}
找到该行并将其删除。
解决方案
- 您想通过使用 Sheets API 搜索值来检索行号。
- 您想通过使用 Sheets API 搜索值来删除行。
如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。
问题和解决方法:
不幸的是,在当前阶段,无法通过 Sheets API 搜索值直接检索行号。此外,无法通过使用 Sheets API 搜索值来删除行。我不确定这些是否会在未来的更新中添加。那么在当前的变通方法中,以下变通方法怎么样?
解决方法 1:
此解决方法的流程如下。
- 使用 Sheets API 中的“spreadsheets.get”方法检索所有工作表名称和工作表 ID。
- 使用“spreadsheets.values.batchGet”Sheets API 的方法从电子表格中的工作表中检索所有值。
- 使用值从检索到的值中搜索工作表名称和行号。
- 在这种情况下,需要准备一个脚本。
- 使用 Sheets API 中的“spreadsheets.batchUpdate”方法删除行。
通过这个流程,您的目标可以实现。
解决方法 2:
在此解决方法中,由 Google Apps 脚本创建的 Web 应用程序用作 API。
1. 新建 Google Apps Script 项目。
Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。
如果要直接创建,请访问https://script.new/。在这种情况下,如果您没有登录 Google,则会打开登录屏幕。所以请登录谷歌。至此,Google Apps Script 的脚本编辑器被打开。
2. 准备脚本。
请将以下脚本复制并粘贴到脚本编辑器中。此脚本适用于 Web 应用程序。在此脚本中,使用了 Sheets API。因此,请在高级 Google 服务中启用 Sheets API。
function doGet(e) {
var findText = e.parameter.value;
var spreadsheetId = e.parameter.spreadsheetId;
var deleteRows = e.parameter.deleteRows && e.parameter.deleteRows.toLowerCase() === "true";
var ss = SpreadsheetApp.openById(spreadsheetId);
var ranges = ss.createTextFinder(findText).findAll();
if (deleteRows === true) {
var requests = ranges.reverse().map(r => ({deleteDimension:{range:{dimension:"ROWS",sheetId:r.getSheet().getSheetId(),startIndex:r.getRow() - 1,endIndex:r.getRow()}}}));
Sheets.Spreadsheets.batchUpdate({requests: requests}, spreadsheetId);
}
var res = ranges.map(r => ({range: `'${r.getSheet().getSheetName()}'!${r.getA1Notation()}`, sheetId: r.getSheet().getSheetId()}));
return ContentService.createTextOutput(JSON.stringify(res));
}
- 在这种情况下,使用 GET 方法。当您想通过提供大数据来运行该功能时,您可以使用
doPost()
代替doGet()
.
3. 部署 Web 应用程序。
- 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
- 为“将应用程序执行为:”选择“我” 。
- 这样,脚本作为所有者运行。
- 此处,当设置“任何人”时,脚本将作为每个用户运行。在这种情况下,需要将脚本共享给每个用户。并且需要使用访问令牌。请注意这一点。
- 为“谁有权访问应用程序:”选择“任何人,甚至匿名” 。
- 在这种情况下,不需要请求访问令牌。我认为作为测试用例,我推荐这个设置。
- 当然,您也可以使用访问令牌。届时,请将此设置为“任何人”。
- 单击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”对话框。
- 单击“查看权限”。
- 选择自己的帐户。
- 在“此应用未验证”中单击“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 单击“确定”。
- 复制 Web 应用程序的 URL。就像
https://script.google.com/macros/s/###/exec
。- 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
3. 使用 Web Apps 运行该功能。
这是使用 Web 应用程序的示例 curl 命令。请设置您的 Web Apps URL、电子表格 ID 和搜索值。
curl -GL \
-d "spreadsheetId=###" \
-d "value=sample" \
"https://script.google.com/macros/s/###/exec"
- 何时
spreadsheetId=###
和value=sample
用作 处的查询参数doGet(e)
。例如,您可以spreadsheetId
使用e.parameter.spreadsheetId
. 在上面的 Web Apps 脚本中,当运行此 curl 命令时,
[{"range":"'Sheet1'!A1","sheetId":0},{"range":"'Sheet2'!B2","sheetId":###}]
会返回 like 的值。这是通过搜索 的值的结果sample
。- 作为示例,从电子表格中的所有工作表中搜索该值。关于这一点,您可以根据自己的实际情况修改脚本。
如果
deleteRows=true
像下面这样使用,则从电子表格中的所有工作表中搜索该值,并删除搜索到的行。curl -GL \ -d "spreadsheetId=###" \ -d "value=sample" \ -d "deleteRows=true" \ "https://script.google.com/macros/s/###/exec"
笔记:
- 此示例脚本与 V8 一起使用。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
推荐阅读
- python - pjsip 无法播放音频:无法打开文件进行播放:未找到 (PJ_ENOTFOUND) [status=70006]
- c# - Unity 5.9 添加了大量额外的库引用
- javascript - 重新排序计算数组上的索引?
- c++ - 重新分配后在 C++ 中删除数组指针是否安全?
- sql - 查询数据库中所有出现的字符串
- javascript - Discord.js 如何制作建议命令?
- mongodb - MongoDB 聚合:无法使用 $cond 引用字段
- html - 仅打印页脚第一页,图像填充第二页
- c# - SSAS ADOMD 连接被强制关闭
- sql - 如何让这个存储过程使用 JSON 检查?