0

0

使用Node.js通过googleapis查询Google表格数据

碧海醫心

碧海醫心

发布时间:2025-10-03 13:45:01

|

608人浏览过

|

来源于php中文网

原创

使用node.js通过googleapis查询google表格数据

本文探讨了在使用Node.jsgoogleapis库时,直接通过Sheets API执行SQL-like查询的局限性。针对这一挑战,文章提供了一种有效的解决方案:利用Google Visualization API的gviz/tq端点。通过服务账户获取访问令牌,并结合request库向gviz/tq端点发送带认证的HTTP请求,即可实现对Google表格数据的灵活查询,并对返回的CSV数据进行解析处理。

Google Sheets API查询的局限性

在使用Node.js的googleapis包与Google Sheets API交互时,开发者通常会使用sheets.spreadsheets.values.batchGet等方法来获取数据。这些方法允许按范围(ranges)获取数据,但它们不直接支持SQL-like的查询语句,例如select * where B = '9831'。当需要根据特定条件筛选大量数据时,如果每次都获取所有数据并在客户端进行过滤,效率会非常低下,尤其是在处理包含数千行甚至更多数据的表格时。

虽然Google Charts提供了一套查询语言,但其直接集成并非通过标准的Sheets API客户端库接口实现,而是需要通过特定的端点进行访问。

解决方案:利用Google Visualization API的gviz/tq端点

要实现对Google表格的SQL-like查询,我们需要绕过googleapis库中Sheets API的直接限制,转而使用Google Visualization API提供的gviz/tq端点。这个端点允许我们传入查询语言(Query Language)语句,并返回查询结果。

核心思路是:

  1. 认证:使用服务账户(Service Account)获取有效的访问令牌(Access Token)。
  2. 构建请求URL:构造一个指向gviz/tq端点的URL,其中包含表格ID、工作表ID以及经过编码的查询语句。
  3. 发送HTTP请求:使用HTTP客户端库(如request或axios)发送带有访问令牌的GET请求到该URL。
  4. 解析响应:gviz/tq端点通常以CSV或其他格式返回数据,需要对响应进行解析以获取结构化的数据。

详细实现步骤

1. 服务账户认证与获取访问令牌

首先,确保你已经配置了Google服务账户凭据,并且该账户拥有访问目标Google表格的权限。googleapis库可以方便地帮助我们进行认证并获取访问令牌。

const { google } = require("googleapis");
const request = require("request"); // 或者使用更现代的axios

// 假设 googleCredentials 已经通过环境变量或配置文件加载
const googleCredentials = require('./path/to/your/service-account-key.json'); 

const auth = new google.auth.GoogleAuth({
  credentials: googleCredentials,
  scopes: "https://www.googleapis.com/auth/spreadsheets", // 访问Google表格的权限
});

// 获取访问令牌
async function getAccessToken() {
  try {
    const accessToken = await auth.getAccessToken();
    return accessToken.token; // 返回令牌字符串
  } catch (err) {
    console.error("获取访问令牌失败:", err);
    throw err;
  }
}

2. 构建查询URL

gviz/tq端点的URL结构如下:

https://docs.google.com/spreadsheets/d/{spreadsheetId}/gviz/tq?tqx=out:csv&gid={sheetId}&tq={encodedQuery}

  • {spreadsheetId}:你的Google表格的ID。
  • tqx=out:csv:指定输出格式为CSV。你也可以选择out:json等。
  • gid={sheetId}:工作表的ID。这个ID可以在Google表格的URL中找到,例如https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit#gid=YOUR_SHEET_ID。
  • tq={encodedQuery}:经过URL编码的查询语句。

注意事项:查询语句的语法遵循Google Visualization API Query Language。例如,字符串值需要用单引号括起来,如'9831'。

const spreadsheetId = "YOUR_SPREADSHEET_ID"; // 替换为你的表格ID
const sheetId = "YOUR_SHEET_GID"; // 替换为你的工作表GID
const query = "select * where B='9831'"; // 你的查询语句

const encodedQuery = encodeURIComponent(query);
const url = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/gviz/tq?tqx=out:csv&gid=${sheetId}&tq=${encodedQuery}`;

3. 发送带认证的HTTP请求

获取到访问令牌和构建好URL后,即可使用request库发送GET请求。请求头中需要包含Authorization: Bearer YOUR_ACCESS_TOKEN。

async function queryGoogleSheet() {
  try {
    const accessToken = await getAccessToken();
    const url = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/gviz/tq?tqx=out:csv&gid=${sheetId}&tq=${encodedQuery}`;

    request(
      {
        url: url,
        method: "GET",
        headers: { authorization: `Bearer ${accessToken}` },
      },
      (err, res, result) => {
        if (err) {
          console.error("请求失败:", err);
          return;
        }
        if (result) {
          // 处理CSV结果
          console.log("原始CSV结果:\n", result);
          parseCsvResult(result);
        } else {
          console.log("未获取到结果。");
        }
      }
    );
  } catch (err) {
    console.error("查询过程中发生错误:", err);
  }
}

4. 解析CSV响应数据

由于gviz/tq端点返回的是CSV格式的数据,我们需要对其进行解析。一个简单的解析函数可以处理基本的CSV格式,但对于复杂的CSV(如包含逗号的字段),建议使用专门的CSV解析库(如csv-parse)。

以下是一个简单的解析示例:

function parseCsvResult(csvString) {
  if (!csvString) {
    console.log("CSV字符串为空。");
    return [];
  }

  // 移除首行(通常是标题行,如果不需要)
  const [, ...dataRows] = csvString.split("\n");

  const parsedData = dataRows.map((row) =>
    row.split(",").map((cell) => {
      // 移除双引号,并尝试转换为数字
      const trimmedCell = cell.replace(/"/g, "");
      return isNaN(trimmedCell) ? trimmedCell : Number(trimmedCell);
    })
  );
  console.log("解析后的数据:", parsedData);
  return parsedData;
}

完整示例代码

将上述片段整合,形成一个完整的查询脚本:

const { google } = require("googleapis");
const request = require("request");

// 替换为你的服务账户凭据路径
const googleCredentials = require('./path/to/your/service-account-key.json'); 

const auth = new google.auth.GoogleAuth({
  credentials: googleCredentials,
  scopes: "https://www.googleapis.com/auth/spreadsheets",
});

const spreadsheetId = "1_YOUR_SPREADSHEET_ID_HERE"; // 替换为你的Google表格ID
const sheetId = "0"; // 替换为你的工作表GID (通常第一个工作表GID是0)
const query = "select * where B='9831'"; // 你的查询语句,例如查询B列值为'9831'的行

async function queryGoogleSheetWithVisualizationAPI() {
  try {
    const accessTokenResponse = await auth.getAccessToken();
    const accessToken = accessTokenResponse.token;

    if (!accessToken) {
      console.error("未能获取到访问令牌。");
      return;
    }

    const encodedQuery = encodeURIComponent(query);
    const url = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/gviz/tq?tqx=out:csv&gid=${sheetId}&tq=${encodedQuery}`;

    console.log("正在发送查询请求到:", url);

    request(
      {
        url: url,
        method: "GET",
        headers: { authorization: `Bearer ${accessToken}` },
      },
      (err, res, result) => {
        if (err) {
          console.error("请求失败:", err);
          return;
        }
        if (result) {
          console.log("原始CSV结果:\n", result);

          // 简单的CSV解析
          const [, ...dataRows] = result.split("\n");
          const parsedData = dataRows.map((row) =>
            row.split(",").map((cell) => {
              const trimmedCell = cell.replace(/"/g, "");
              return isNaN(trimmedCell) ? trimmedCell : Number(trimmedCell);
            })
          );
          console.log("解析后的数据:", parsedData);
        } else {
          console.log("未获取到任何结果。");
        }
      }
    );
  } catch (err) {
    console.error("查询过程中发生错误:", err);
  }
}

// 执行查询
queryGoogleSheetWithVisualizationAPI();

注意事项

  • 查询语言语法:确保你的查询语句符合Google Visualization API Query Language的规范。例如,字符串值必须用单引号'括起来。
  • CSV解析的健壮性:上述示例中的CSV解析是一个简化版本。如果你的表格数据包含逗号、换行符或引号等特殊字符,或者需要更复杂的类型转换,强烈建议使用成熟的Node.js CSV解析库(如csv-parse或fast-csv)来确保数据的正确解析。
  • 错误处理:在实际生产环境中,需要更完善的错误处理机制,包括网络请求失败、认证失败、API返回错误等情况。
  • 性能:虽然gviz/tq端点提供了强大的查询能力,但对于超大规模的数据集,仍然需要考虑其性能限制和Google API的配额。
  • request库:request库已经进入维护模式,建议在新项目中考虑使用更现代的HTTP客户端,如axios或Node.js内置的fetch API(Node.js v18+)。

总结

尽管googleapis的Sheets API客户端库不直接支持SQL-like查询,但通过巧妙地利用Google Visualization API的gviz/tq端点,并结合服务账户认证和HTTP请求,我们可以在Node.js环境中实现对Google表格数据的强大且灵活的查询功能。这种方法有效地解决了处理大型表格数据时,按条件筛选数据的效率问题,为开发者提供了更高级的数据操作能力。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

682

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

416

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号