【问题标题】:Google Sheets API in AngularAngular 中的 Google 表格 API
【发布时间】:2019-11-25 16:44:52
【问题描述】:

我正在尝试了解如何在 Angular 中使用 Google Sheets API。 documentation page 上没有提到 Angular。我已经尝试过this,但它似乎不起作用。

谁能指导我如何在 Angular 应用程序中使用 Google Sheets API?

我目前正在使用 Angular 8

【问题讨论】:

标签: angular google-sheets-api


【解决方案1】:

我为这个用例制作了一个 Angular 库!

使用ng-google-sheets-db,您可以轻而易举地从 Google 表格中加载数据,并使用Google Sheets 作为 Angular 应用的(只读)后端!您可以查看Stackblitz example app

安装

ng add ng-google-sheets-db

npm install ng-google-sheets-db

用法

谷歌表格

  1. 创建Google Sheet
    • 第一行必须是标题。
    • 以下行是您的条目,每行一个条目。
    • 您可能有一个 活动 列,您可以使用它启用或禁用行/条目。
    • 可通过here 获取 Google 表格演示电子表格。
  2. 分享您的工作表:
    • [文件] → [分享] → 在模式底部的“获取链接”处单击[更改为知道链接的任何人] 以成为“查看者”。
    • 获取电子表格 ID(即1gSc_7WCmt-HuSLX01-Ev58VsiFuhbpYVo8krbPCvvqA):它是 Google 电子表格 URL 的一部分。
    • 获取工作表名称:工作表的名称可以在您的 Google 电子表格底部找到。
  3. 可选:为您的 Google 帐户启用2-Step Verification 可能是个好主意,如果您还没有这样做的话:wink:。

谷歌云平台 (GCP)

一个很好的概述指南是Get started as a Workspace developer

  1. Google Cloud Console 中创建一个新项目。
  2. 启用 Google Sheets API:[API 和服务] → [启用 API 和服务] → 搜索“Google Sheets API”→ [启用]。
  3. 创建 API 密钥:[APIs & Services] → [Credentials] → [+ CREATE CREDENTIALS] → [API key] → [RESTRICT KEY] → 在“应用程序限制”中选择“HTTP 引用(网站)”和“网站限制”并在“API 限制”中选择“限制键”并选择“Google Sheets API”→[保存]。
  4. 获取生成的 API 密钥。

角度

GoogleSheetsDbService 作为提供者添加到您应用的模块中,并将Angular 的HttpClientModule 添加到导入中:

import { HttpClientModule } from '@angular/common/http';

import { API_KEY, GoogleSheetsDbService } from 'ng-google-sheets-db';

@NgModule({
  ...
  imports: [
    HttpClientModule,
    ...
  ],
  providers: [
    {
      provide: API_KEY,
      useValue: <YOUR_GOOGLE_SHEETS_API_KEY>,
    },
    GoogleSheetsDbService
  ],
  ...
})
export class AppModule { }

导入并注入到组件的构造函数中:

import { GoogleSheetsDbService } from 'ng-google-sheets-db';

@Component({
  ...
})
export class YourComponent implements OnInit {
  characters$: Observable<Character[]>;

  constructor(private googleSheetsDbService: GoogleSheetsDbService) { }

  ngOnInit(): void {
    this.characters$ = this.googleSheetsDbService.get<Character>('1gSc_7WCmt-HuSLX01-Ev58VsiFuhbpYVo8krbPCvvqA', "Characters", characterAttributesMapping);
  }

属性映射

attributesMapping 将 Google 电子表格列映射到您的结果对象。

const attributesMapping = {
  id: "ID",
  name: "Name",
  email: "Email Address",
  contact: {
    _prefix: "Contact ",
    street: "Street",
    streetNumber: "Street Number",
    zip: "ZIP",
    city: "City",
  },
  skills: {
    _prefix: "Skill ",
    _listField: true,
  },
};

例如,Google 电子表格列 电子邮件地址 映射到结果对象属性 email

嵌套对象

contact 是嵌套对象的示例。您可以将_prefix 定义为嵌套对象所有列的前缀。请注意,_prefix 可能需要一个尾随空格。

列表

skills 是一个列表示例。您需要为列表的所有列设置_listField_prefix。在此示例中,所有以 _Skill _ 开头且数量不断增加的列都是列表的一部分,即 Skill 1Skill 2 等。请注意 _prefix可能需要一个尾随空格。

它带有一个step by step usage guide 和一个demo application

【讨论】:

  • 为什么现在不行了?我遇到 CORS 错误...(android 真实设备和网站)
  • @M.Mariscal 您是否发布了电子表格?有一个类似的问题,请参阅github.com/FranzDiebold/ng-google-sheets-db-library/issues/3 了解更多信息。
  • @juniortan 这是正确的。我相应地更新了我的答案。
  • @FranzDiebold 那个库看起来不错,你为什么不包括服务帐户身份验证和写入
  • @juniortan 我只需要一个“只读”数据库功能。在我看来,在前端应用程序中使用“公共”API 密钥编写功能并不是一个好主意。
【解决方案2】:

查看这篇文章:http://leifwells.com/2016/06/09/ionic-2--angular-2-using-a-google-spreadsheet-as-a-data-source/

您不需要任何外部包,只需对您的工作表执行 http 请求。

考虑到上述情况,您可以尝试以下方法:

  1. 将您的工作表发布到网络:

    转到您的 Google 表格,然后选择 File &gt; Publish to the Web 选项最终会为您提供一个其中包含 id 的 URL 这很重要。在我们的例子中,url 如下所示:

    https://docs.google.com/spreadsheets/d/15Kndr-OcyCUAkBUcq6X3BMqKa_y2fMAXfPFLiSACiys/pubhtml

    这个url中的id是:

    15Kndr-OcyCUAkBUcq6X3BMqKa_y2fMAXfPFLiSACiys

  2. 创建一个 Google 表格提供者(使用第一个链接作为参考):

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { map } from 'rxjs/operators';

@Injectable()
export class GoogleDriveProvider {
  data: any = null;

  constructor(public http: Http) { }

  public getSheetData(): Observable<any> {
    const sheetId = '15Kndr-OcyCUAkBUcq6X3BMqKa_y2fMAXfPFLiSACiys';
    const url = `https://spreadsheets.google.com/feeds/list/${sheetId}/od6/public/values?alt=json`;

    return this.http.get(url)
      .pipe(
        map((res: any) => {
          const data = res.feed.entry;

          const returnArray: Array<any> = [];
          if (data && data.length > 0) {
            data.forEach(entry => {
              const obj = {};
              for (const x in entry) {
                if (x.includes('gsx$') && entry[x].$t) {
                  obj[x.split('$')[1]] = entry[x]['$t'];
                }
              }
              returnArray.push(obj);
            });
          }
          return returnArray;
        })
      );
  }
}

注意:该示例使用的是 Angular 8。

【讨论】:

  • 那么使用不公开共享的电子表格呢?
  • 你试过ng-gapi吗? github.com/rubenCodeforges/ng-gapi
  • 请更新答案以使用示例,我将接受作为答案和赏金
  • @Gustavo,这是一个很好的解释。谢谢你。你知道 observable 是否应该选择对已发布电子表格的更改吗?在调用 get 时,我似乎只收到一次响应,但在那之后,电子表格中的更改不会发送到流中。
  • @GustavoSantamaría 我正在尝试这个,但它一直在登录:错误类型错误:res.feed 未定义”在服务(提供者)中...你有什么提示吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多