php - 带有 php 的 Google Sheets API - 查找单元格值
问题描述
我正在使用带有 PHP 的 Google Sheets API 并阅读一张表格,我需要找到一行并更新其内容。
我目前正在遍历行,寻找价值,但随着工作表的增长,这似乎相当低效。有没有办法搜索单元格,检索行,然后我可以更新?
我的迭代代码如下。
$spreadsheet = (new Google\Spreadsheet\SpreadsheetService)
->getSpreadsheetFeed()
->getById("xxx sheet id xxx");
$worksheets = $spreadsheet->getWorksheetFeed()->getEntries();
$worksheet = $worksheets[0];
$CellFeed = $worksheet->getCellFeed();
foreach ($CellFeed->getEntries() as $E)
{
$r = $E->getRow();
/* ...... */
}
解决方案
我相信你的目标如下。
- 您想从电子表格中的特定列中搜索一个值,并想检索搜索行的行号。
- 您想使用 PHP 来实现这一点。
问题和解决方法:
在这种情况下,不幸的是,当使用 Sheets API 时,在当前阶段,需要执行以下流程。
- 从要搜索的工作表中检索所有值。
- 从检索到的值中检索行号和列号。
这可能与您当前的脚本相同。因为在当前阶段,Sheets API 中没有直接搜索值的方法。因此,在这个答案中,作为一种解决方法,我想建议使用由 Google Apps Script 创建的 Web Apps。使用 Google Apps Script 时,可以通过内置方法 TextFinder 检索搜索到的行号。TextFinder 的处理成本低。所以我提出了它。
用法:
请执行以下流程。
1. 新建 Google Apps Script 项目。
Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。
如果要直接创建,请访问https://script.new/。在这种情况下,如果您没有登录 Google,则会打开登录屏幕。所以请登录谷歌。至此,Google Apps Script 的脚本编辑器被打开。
需要将此 Google Apps 脚本项目放入您要使用的电子表格的同一 Google Drive。
2. 准备脚本。
请将以下脚本(Google Apps 脚本)复制并粘贴到脚本编辑器中。此脚本适用于 Web 应用程序。
function doGet(e) {
const sheet = SpreadsheetApp.openById(e.parameter.spreadsheetId).getSheetByName(e.parameter.sheetName);
const res = sheet.getRange(1, 2, sheet.getLastRow()).createTextFinder(e.parameter.searchValue).findAll().map(r => r.getRow());
return ContentService.createTextOutput(JSON.stringify({rowNumbers: res})).setMimeType(ContentService.MimeType.JSON);
}
3. 部署 Web 应用程序。
- 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
- 为“将应用程序执行为:”选择“我” 。
- 这样,脚本作为所有者运行。
- 为“谁有权访问应用程序:”选择“任何人,甚至匿名” 。
- 在这种情况下,不需要请求访问令牌。我认为我建议使用此设置来测试此解决方法。
- 当然,您也可以使用访问令牌。当您使用访问令牌时,请包括 Drive API 的范围之一,例如
https://www.googleapis.com/auth/drive.readonly
. - 而且,我认为键值可以用作查询参数而不是访问令牌。
- 单击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”对话框。
- 单击“查看权限”。
- 选择自己的帐户。
- 在“此应用未验证”中单击“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 单击“确定”。
- 复制 Web 应用程序的 URL。就像
https://script.google.com/macros/s/###/exec
。- 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
4. 使用 PHP 脚本测试 Web 应用程序。
请将您的 Web 应用程序的 URL 设置为以下脚本。并且,请设置电子表格 ID、表格名称。根据您的回复,在此示例中,搜索值和列号分别为Pj/5678
和2
。2
ofsearchColumn
表示“B”列。
<?php
$url = 'https://script.google.com/macros/s/###/exec'; // Please set the URL of Web Apps.
$q = array(
'spreadsheetId' => '###', // Please set the Spreadsheet ID.
'sheetName' => 'Sheet1',
'searchValue' => 'Pj/5678',
'searchColumn' => 2
);
$curl = curl_init();
$option = [
CURLOPT_URL => $url . '?' . http_build_query($q),
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true
];
curl_setopt_array($curl, $option);
$res = curl_exec($curl);
$obj = json_decode($res);
print_r($obj);
curl_close($curl);
?>
结果:
运行上述脚本时,将返回以下值。返回搜索行的行号。
{"rowNumbers":[###, ###,,,]}
笔记:
- 当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。请注意这一点。
参考:
推荐阅读
- python - 对数据框行的操作
- sql - SQL - 使用服务组合查找帐户
- sqlite - 限制具有别名的列的结果
- sql - 为什么向 LIKE 添加第二个选项似乎撤消了我的 date = 功能?
- android - Android Room DAO 获得一个带有 crossRef 的字段
- google-apps-script - Google Apps 脚本在大约 30 秒内显示“超过最大执行时间”
- windows - Firefox 支持的拖放目标格式
- php - 如何通过访问其他表来获取所有被阻止的客户端来获取它
- javascript - 如何在赛普拉斯中获取具有动态选择器的元素
- roblox - 如何在 Roblox 中制作这些“提示”外观的东西?