注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Google Sheets コネクターは、Google Sheets 用の Palantir 提供のドライバーです。
新しい Google Sheets ソースを作成するには、Palantir 提供のドライバーの標準セットアップフローに沿って進め、以下のセクションで Google Sheets 固有の設定とネットワーク設定を行います。プロパティの完全なリファレンスについては、Google Sheets ドライバーの公式ドキュメント ↗を参照してください。
一括読み取りには、ソースエクスプローラーとバッチ同期を使用します。スプレッドシートの固定範囲を読み取りまたは更新するには、Google Sheets API のコード例を使用します。
| 機能 | ステータス |
|---|---|
| 探索 | 🟢 一般提供 |
| バッチ同期 | 🟢 一般提供 |
| インクリメンタル(差分連携) | 🟢 一般提供 |
以下のテーブルは、ソースの実行に必要なアクセス先ドメインを示しています。
Foundry ワーカー接続では、ドメインごとにエグレスポリシーを適用します。
ドメインが別のネットワーク上にあり、Agent プロキシのエグレスポリシー(推奨)または Agent ワーカー(非推奨)を使用する場合、Agent からこれらのドメインに到達できる必要があります。また、これらのドメイン上のシステムでも、Agent からの接続を許可する必要があります。Agent のネットワークについて詳しくはこちら。
| ドメイン | 必須 |
|---|---|
| accounts.google.com | 常に必須。OAuth に必要です |
www.googleapis.com | 常に必須 |
Google Sheets API v4 ↗ を使用してスプレッドシートの範囲を読み取りまたは更新するには、呼び出し元の属性に基づいてソースの種類を選択します。
AuthScheme を OAuthJWT に設定し、Google サービスアカウントの JSON 資格情報を使用して Google Sheets ソースを設定し、対象のスプレッドシートをサービスアカウントと共有します。読み取りの例には読み取りアクセス権を、書き込みの例には編集アクセス権を付与します。接続プロパティの完全な一覧については、CData のサービスアカウントガイダンス ↗ を参照してください。
外部トランスフォームのセットアップに沿って、transforms-external-systems をインストールし、ソースのコードインポートを有効にして、トランスフォームリポジトリにインポートします。また、リポジトリに google-auth、requests、pandas を追加します。パイプラインのプレースホルダーを、ソース RID、出力データセットのパス、スプレッドシートID、ワークシート、置換値に置き換えます。ソースは、OAuth_Jwt_Certification シークレットエイリアスを通じて Google の JSON 資格情報を公開する必要があります。
oauth2.googleapis.com:443 と sheets.googleapis.com:443 の直接ネットワークエグレスポリシーを適用します。ソースからプロキシ URI が提供される場合、これらの例ではトークン交換と Sheets API リクエストの両方にその URI を使用します。それ以外の場合、どちらの呼び出しも設定された直接ルートを使用します。
関数の例では、https://sheets.googleapis.com 用の REST API ソースを作成し、OAuth 2.0 アウトバウンドアプリケーションを使用して設定します。認可エンドポイントには https://accounts.google.com/o/oauth2/v2/auth を、トークンエンドポイントには https://oauth2.googleapis.com/token を使用します。https://www.googleapis.com/auth/spreadsheets スコープとオフラインアクセスを要求します。トークンの更新に依存する関数はサーバーレスモードで実行してください。デプロイモードでは、期限切れになった呼び出し元ユーザーのトークンを自動的に更新できません。クライアントID、クライアントシークレット、および Foundry に表示されるリダイレクト URL を設定します。accounts.google.com:443、oauth2.googleapis.com:443、sheets.googleapis.com:443 の直接ネットワークエグレスポリシーを適用します。
外部 API へのアクセスを設定するに沿って、REST API ソースのエクスポートとコードインポートを有効にし、Functions リポジトリにインポートします。関数のプレースホルダーを、そのソースの RID、スプレッドシートID、ワークシートに置き換えます。関数を呼び出す前に、関数ベースのアクションなどの対話型ワークフローを通じて、呼び出し元ユーザーとしてアウトバウンドアプリケーションを認可してください。これらの例では、ユーザーのセッション資格情報を取得し、アクセストークンを API リクエストに挿入します。実行時および認可の制約については、アウトバウンドアプリケーションで OAuth 2.0 を使用するを参照してください。
例を用途に合わせて変更する前に、山括弧で囲まれたすべてのプレースホルダーを置き換えてください。TypeScript v1 Function のランタイムは、このワークフローに必要な委任 OAuth 資格情報を公開しないため、その例は提供していません。委任アクセスには、Python Function または TypeScript v2 Function の例を使用します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43import json from urllib.parse import quote import pandas as pd import requests from google.auth.transport.requests import Request from google.oauth2 import service_account from transforms.api import Output, transform_pandas from transforms.external.systems import Source, external_systems SOURCE_RID = "<GOOGLE_SHEETS_SOURCE_RID>" OUTPUT_DATASET = "<OUTPUT_DATASET_PATH>" SPREADSHEET_ID = "<SPREADSHEET_ID>" READ_RANGE = "'<WORKSHEET_NAME>'!A1:C3" @external_systems(google_sheets=Source(SOURCE_RID)) @transform_pandas(Output(OUTPUT_DATASET)) def compute(google_sheets) -> pd.DataFrame: service_account_info = json.loads( google_sheets.get_secret("OAuth_Jwt_Certification") ) session = requests.Session() proxy_uri = google_sheets.get_https_proxy_uri() if proxy_uri: session.proxies.update({"http": proxy_uri, "https": proxy_uri}) credentials = service_account.Credentials.from_service_account_info( service_account_info, scopes=["https://www.googleapis.com/auth/spreadsheets.readonly"], ) credentials.refresh(Request(session=session)) response = session.get( "https://sheets.googleapis.com/v4/spreadsheets/" f"{SPREADSHEET_ID}/values/{quote(READ_RANGE, safe='')}", headers={"Authorization": f"Bearer {credentials.token}"}, timeout=30, ) response.raise_for_status() values = response.json()["values"] return pd.DataFrame(values[1:], columns=values[0])
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30import json from urllib.parse import quote import requests from functions.api import function from functions.sources import get_source SOURCE_RID = "<GOOGLE_SHEETS_DELEGATED_SOURCE_RID>" SPREADSHEET_ID = "<SPREADSHEET_ID>" READ_RANGE = "'<WORKSHEET_NAME>'!A1:C3" @function(sources=[SOURCE_RID]) def read_google_sheet_values() -> str: source = get_source(rid=SOURCE_RID) credentials = source.get_session_credentials().get() session = requests.Session() proxy_uri = source.get_https_proxy_uri() if proxy_uri: session.proxies.update({"http": proxy_uri, "https": proxy_uri}) response = session.get( "https://sheets.googleapis.com/v4/spreadsheets/" f"{SPREADSHEET_ID}/values/{quote(READ_RANGE, safe='')}", headers={"Authorization": f"Bearer {credentials.access_token}"}, timeout=30, ) response.raise_for_status() return json.dumps(response.json())
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27import { getFetch, getSource } from "@palantir/functions-sources"; const SOURCE_RID = "<GOOGLE_SHEETS_DELEGATED_SOURCE_RID>"; const SPREADSHEET_ID = "<SPREADSHEET_ID>"; const READ_RANGE = "'<WORKSHEET_NAME>'!A1:C3"; export const config = { sources: [SOURCE_RID] }; export default async function readGoogleSheetValues(): Promise<string> { const source = await getSource({ rid: SOURCE_RID }); const credentials = await source.sessionCredentials?.get(); if (!credentials || credentials.type !== "oauth") { throw new Error("Authorize the outbound application before running this Function"); } const sourceFetch = await getFetch(source); const url = `https://sheets.googleapis.com/v4/spreadsheets/${SPREADSHEET_ID}/values/` + encodeURIComponent(READ_RANGE); const response = await sourceFetch(url, { headers: { Authorization: `Bearer ${credentials.accessToken}` }, }); if (!response.ok) { throw new Error(`Google Sheets returned HTTP ${response.status}`); } return JSON.stringify(await response.json()); }
以下の例では、valueInputOption=RAW を指定した1回の spreadsheets.values.update リクエスト ↗を使用して、設定されたワークシートのセル B2 を指定した値で上書きします。
山括弧で囲まれたすべてのプレースホルダーを置き換え、対象のセルを確認してください。書き込みを有効にするには、確認フラグを設定します。それ以外の場合、例は Google Sheets に接続せずに終了します。
対象のセルに対しては、同時に実行する書き込み処理を1つだけにしてください。リクエストの結果が不明な場合は、再試行する前にセルを確認してください。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51import json from urllib.parse import quote import pandas as pd import requests from google.auth.transport.requests import Request from google.oauth2 import service_account from transforms.api import Output, transform_pandas from transforms.external.systems import Source, external_systems SOURCE_RID = "<GOOGLE_SHEETS_SOURCE_RID>" OUTPUT_DATASET = "<OUTPUT_DATASET_PATH>" SPREADSHEET_ID = "<SPREADSHEET_ID>" TARGET_RANGE = "'<WORKSHEET_NAME>'!B2" REPLACEMENT_VALUE = "<REPLACEMENT_VALUE>" CONFIRM_WRITE = False @external_systems(google_sheets=Source(SOURCE_RID)) @transform_pandas(Output(OUTPUT_DATASET)) def compute(google_sheets) -> pd.DataFrame: if not CONFIRM_WRITE: return pd.DataFrame([{"status": "dry_run", "mutated": False}]) service_account_info = json.loads( google_sheets.get_secret("OAuth_Jwt_Certification") ) session = requests.Session() proxy_uri = google_sheets.get_https_proxy_uri() if proxy_uri: session.proxies.update({"http": proxy_uri, "https": proxy_uri}) credentials = service_account.Credentials.from_service_account_info( service_account_info, scopes=["https://www.googleapis.com/auth/spreadsheets"], ) credentials.refresh(Request(session=session)) url = ( "https://sheets.googleapis.com/v4/spreadsheets/" f"{SPREADSHEET_ID}/values/{quote(TARGET_RANGE, safe='')}" "?valueInputOption=RAW" ) response = session.put( url, headers={"Authorization": f"Bearer {credentials.token}"}, json={"range": TARGET_RANGE, "majorDimension": "ROWS", "values": [[REPLACEMENT_VALUE]]}, timeout=30, ) response.raise_for_status() return pd.DataFrame([response.json()])
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38import json from urllib.parse import quote import requests from functions.api import function from functions.sources import get_source SOURCE_RID = "<GOOGLE_SHEETS_DELEGATED_SOURCE_RID>" SPREADSHEET_ID = "<SPREADSHEET_ID>" TARGET_RANGE = "'<WORKSHEET_NAME>'!B2" @function(sources=[SOURCE_RID]) def write_google_sheet_value(new_value: str, confirm: bool = False) -> str: if not confirm: return json.dumps({"status": "dry_run", "mutated": False}) source = get_source(rid=SOURCE_RID) credentials = source.get_session_credentials().get() session = requests.Session() proxy_uri = source.get_https_proxy_uri() if proxy_uri: session.proxies.update({"http": proxy_uri, "https": proxy_uri}) url = ( "https://sheets.googleapis.com/v4/spreadsheets/" f"{SPREADSHEET_ID}/values/{quote(TARGET_RANGE, safe='')}" "?valueInputOption=RAW" ) response = session.put( url, headers={"Authorization": f"Bearer {credentials.access_token}"}, json={"range": TARGET_RANGE, "majorDimension": "ROWS", "values": [[new_value]]}, timeout=30, ) response.raise_for_status() return json.dumps(response.json())
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43import { getFetch, getSource } from "@palantir/functions-sources"; const SOURCE_RID = "<GOOGLE_SHEETS_DELEGATED_SOURCE_RID>"; const SPREADSHEET_ID = "<SPREADSHEET_ID>"; const TARGET_RANGE = "'<WORKSHEET_NAME>'!B2"; export const config = { sources: [SOURCE_RID] }; export default async function writeGoogleSheetValue( newValue: string, confirm: boolean = false, ): Promise<string> { if (!confirm) { return JSON.stringify({ status: "dry_run", mutated: false }); } const source = await getSource({ rid: SOURCE_RID }); const credentials = await source.sessionCredentials?.get(); if (!credentials || credentials.type !== "oauth") { throw new Error("Authorize the outbound application before running this Function"); } const sourceFetch = await getFetch(source); const url = `https://sheets.googleapis.com/v4/spreadsheets/${SPREADSHEET_ID}/values/` + `${encodeURIComponent(TARGET_RANGE)}?valueInputOption=RAW`; const response = await sourceFetch(url, { method: "PUT", headers: { Authorization: `Bearer ${credentials.accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ range: TARGET_RANGE, majorDimension: "ROWS", values: [[newValue]], }), }); if (!response.ok) { throw new Error(`Google Sheets returned HTTP ${response.status}`); } return await response.text(); }