Google Sheets API与php-查找单元格值

Google Sheets API与php-查找单元格值,php,google-apps-script,google-sheets,Php,Google Apps Script,Google Sheets,我正在用PHP和GoogleSheetsAPI阅读一个工作表,我需要找到一行并更新它的内容 我目前正在对行进行迭代,寻找值,但随着工作表的增长,这似乎效率很低。有没有办法搜索单元格,检索行,然后更新 我要迭代的代码如下所示 $spreadsheet = (new Google\Spreadsheet\SpreadsheetService) ->getSpreadsheetFeed() ->getById("xxx

我正在用PHP和GoogleSheetsAPI阅读一个工作表,我需要找到一行并更新它的内容

我目前正在对行进行迭代,寻找值,但随着工作表的增长,这似乎效率很低。有没有办法搜索单元格,检索行,然后更新

我要迭代的代码如下所示

        $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();
            /* ...... */
        }

我相信你的目标如下

        $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时,在当前阶段,需要执行以下流程

  • 从要搜索的工作表中检索所有值
  • 从检索到的值中检索行号和列号
  • 这可能与您当前的脚本相同。因为在当前阶段,没有直接在API表中搜索值的方法。因此,在这个答案中,作为一种解决方法,我建议使用由Google Apps脚本创建的Web应用程序。使用GoogleApps脚本时,内置的TextFinder方法可以检索搜索到的行号。而且TextFinder的处理成本很低。所以我提出了

    用法: 请执行以下流程

    1.创建谷歌应用程序脚本的新项目。 Web应用程序的示例脚本是Google应用程序脚本。因此,请创建一个谷歌应用程序脚本项目

    如果要直接创建,请访问。在这种情况下,如果您没有登录Google,则会打开登录屏幕。所以请登录谷歌。这样,谷歌应用程序脚本的脚本编辑器就打开了

    需要将此Google Apps脚本项目放在要使用的电子表格的同一Google驱动器中

    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应用”打开对话框
  • 选择“我”以执行应用程序:“”。
    • 这样,脚本将作为所有者运行
  • 为有权访问应用程序的用户选择“任何人,甚至匿名”
    • 在这种情况下,请求时不需要访问令牌。我认为我推荐使用此设置来测试此解决方案
    • 当然,您也可以使用访问令牌。使用访问令牌时,请包括驱动器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”表示“B”列

    注:
    • 修改Web应用脚本时,请将Web应用重新部署为新版本。这样,最新的脚本就会反映到Web应用程序中。请注意这一点。
    参考资料:

    在您的目标中,您希望检索哪个搜索行的值或搜索行的行号?我希望找到任何匹配的行号-我知道该值将位于哪个列中。例如,在B列中查找值Pj/5678,然后我可以更新同一行中的另一个单元格谢谢您的回复。从你的答复中,我提出了一个变通办法作为答案。你能确认一下吗?如果这不是你期望的方向,我道歉。谢谢-这需要一点消化和经历。但如果一切正常,我会尝试将其标记为已回答。谢谢again@StripyTiger谢谢你的回复。在我所处的环境中,我可以确认变通方法是有效的。但在你的环境中,如果这不是你所期望的方向,我很抱歉。很抱歉耽搁了-这确实有效,谢谢你的帮助。@StripyTiger没问题。谢谢你的测试。也谢谢你。
    {"rowNumbers":[###, ###,,,]}