Google Drive
Google Drive Connectorは、ドライブのファイルとフォルダを一覧し、その内容とコメントを読み、ファイルをアップロード・置換し、名前の変更と移動を行い、ゴミ箱に入れ、コピーと共有をします。プログラムはこれを使って、文書を探し、その内容をLLMに渡し、人が探しに来る場所にレポートやエクスポートを置きます。
読み取り元
drive.files— アカウントから見えるファイルとフォルダ。resource、version(ファイルの最新リビジョンのid)、id、name、mime_type、parents(フォルダid)、size、owner、created_time、modified_time、web_view_link、trashed、shared。キーはidです。フォルダ、名前、MIMEタイプ、日時で絞り込んでください。Connectorがドライブ全体を一覧することはありません。LIST_FILES(drive, glob => r'Reports/*.pdf')はパスによる同じ一覧で、resource、version、pathを返します。drive.contents— ファイルの内容。resource、version、id、name、media_type、そしてcontent_refのcontent。drive.filesまたはLIST_FILESからresourceとversionでJOINしてください。ConnectorはJOINで指定されたリビジョンだけをダウンロードします。Googleドキュメントはtext/plain、Googleスプレッドシートはtext/csv、Googleスライドはapplication/pdfとしてエクスポートされ、それ以外のファイルはそのままのメディアタイプで読みます。drive.comments— ファイルのコメント。id、file_id、author、content、created_time、resolved、anchor。キーはidです。file_idで絞り込んでください。
JOINでリビジョンを指定するので、Runの途中で置き換えられたファイルは別のバージョンになり、一覧で見たファイルの代わりに読まれることはありません。
型
| Driveの項目 | ActQL | 備考 |
|---|---|---|
id、name、mime_type、owner、web_view_link | string | |
parents | array<string> | フォルダid。共有ドライブのファイルは親が1つ |
size | int64 | バイト数。Googleドキュメント、スプレッドシート、スライドは固定のサイズを持たないので NULL |
created_time、modified_time | timestamp | UTC、ミリ秒の精度 |
version | string | 最新リビジョンのid。新しいリビジョンは新しい version |
trashed、shared、resolved | bool | |
content | content_ref | media_type 付き。Googleの形式はエクスポートの種類(text/plain、text/csv、application/pdf)を持つ |
Effectと操作
レコードのEffectは id で書きます。
- update —
EFFECT UPDATE drive.files ID id SET (name = …, parents = …, description = …)は、ファイルの名前を変え、移動し、説明を付けます。parentsはフォルダの集合を置き換えます。 - delete —
EFFECT DELETE drive.files ID idは、ファイルをゴミ箱に移します。Driveから元に戻せます。完全に削除するには、ゴミ箱の中のファイルに対してEFFECT COMMAND drive.purge TARGET id ID keyを実行します。
コンテンツ:
- upload —
EFFECT STORE drive.files SET (folder = …, name = …, content = content [, overwrite = TRUE])は、レコードのcontent(SERIALIZEまたはcontentsの読み取り元から来たcontent_ref)からフォルダにファイルを作ります。overwrite = TRUEを付けると、フォルダにある同名のファイルが新しいリビジョンとして置き換えられます。付けなければ、同名のファイルがあるときその項目はfailedになります。
操作:
- copy —
EFFECT COMMAND drive.copy TARGET id ID key INPUT (folder = …, name = …)は、ファイルをフォルダにコピーします。 - share —
EFFECT COMMAND drive.share TARGET id ID key INPUT (email = …, role = 'reader' | 'commenter' | 'writer', notify = FALSE)は、ファイルに権限を付与します。 - purge —
EFFECT COMMAND drive.purge TARGET id ID keyは、ゴミ箱の中のファイルを完全に削除します。
TARGET は操作の対象となるファイル、ID はレコードのキーで、プレビューとステータスで各操作を識別します。
セットアップ
"drive": {
"connector": "drive",
"credentials": {"service_account": {"env": "GOOGLE_SERVICE_ACCOUNT_JSON"}}
}プログラムが読むフォルダはサービスアカウントと閲覧者として、書き込むフォルダは編集者として共有します。ファイルを他者と共有するには、アカウントがそのファイルの所有者であるか、共有が許可された writer を持っている必要があります。アカウントには https://www.googleapis.com/auth/drive のスコープが、読み取りだけの接続なら drive.readonly が必要です。共有ドライブは、アカウントがメンバーであれば使えます。サービスアカウントの代わりに、1人のユーザーのOAuthリフレッシュトークンを渡すこともできます。ActQL Cloudでは、ホスト型のGoogle OAuthでユーザーがサインインし、その許可が保存されます。それ以外の接続の項目は同じです。
Capabilityとプッシュダウン
| 演算 | プッシュダウンされる条件 |
|---|---|
| 列の選択 | 常に。Connectorはプログラムが使う項目だけを要求する |
drive.files への WHERE | 述語が name(等価、LIKE 'prefix%'、部分一致)、mime_type、parents(IN UNNEST)、modified_time/created_time の比較、trashed、shared、owner を使うとき。Driveのクエリ言語はこれらを同じ意味で評価する。名前の照合が大文字小文字を区別しないのはDriveの振る舞いなので、大文字小文字を区別する名前の述語はHostが再確認する |
drive.comments への WHERE | file_id と resolved |
ORDER BY、LIMIT | name、modified_time、created_time、size。件数はページサイズになる |
| 内容の読み取り | 一覧で選ばれたあと、ファイルごとに。一括エクスポートは行わない |
集計、JOIN | 行わない。Hostで実行する |
プレビューと突き合わせ
プレビュー。 更新と削除は full_diff です。Connectorはファイルの現在のメタデータ(名前、親、説明、ゴミ箱の状態)とリビジョンidを読み、プレビューには現在の値と新しい値が出ます。リクエストはそのリビジョンを条件にします。その間に変わったファイルは、黙って上書きされるのではなく、項目が failed(conflict)になります。アップロードは targeted です。プレビューには、書き込まれるフォルダ、ファイル名、メディアタイプ、サイズ、コンテンツの識別子と、既存のファイルを置き換えるかどうか(置き換えるならどのリビジョンか)が出ます。コピーと共有は、元のファイル、宛先または付与先、ロールをプレビューします。
突き合わせ。 アップロードとコピーは、ファイルの appProperties にリクエストのマーカーを持ちます。アップロードは再開可能なセッションを使い、Connectorは応答が届くまでアップロードURIを保持します。応答が失われた場合は、まずセッションの状態を照会し、次に appProperties にマーカーを持ち、md5Checksum が承認されたコンテンツの識別子と一致するファイルをフォルダから探して突き合わせます。更新、削除、共有はDriveのアクティビティ記録で突き合わせます。この接続のアカウントがリクエストの時間帯に行い、承認された変更を作った操作があれば確定し、ファイルが承認された値や新しいリビジョンを持っているだけでは確定しません。名前は合っていてもマーカーのないファイルは証跡になりません。証跡がなければ項目は unknown のままで、何も再送しません。操作はDriveが確認した時点で applied になります。大きなファイルのコピーは、Driveが処理を終えるまで accepted です。
上限と費用
- 一覧は100ファイルずつページングされ、プログラムの件数の上限の範囲で読みます。
- 内容の読み取りはプログラムのバイト数の上限で抑えられます。大きなエクスポートは途中で切られるのではなく拒否されます。Googleドキュメントのエクスポートはプレーンテキストで、書式、画像、コメントは含まれません。スプレッドシートは最初のシートのCSVとしてエクスポートされます。Sheets Connectorでシートの範囲を指定した場合は別です。
- Driveのユーザーごと・プロジェクトごとのクエリ割り当てが適用されます。Connectorはその範囲内でペースを調整し、1日の割り当てを超えそうなプログラムは送信前に失敗させます。
- 5MBを超えるアップロードは再開可能なセッションを使います。所有するアカウントのDriveの保存容量が適用されます。Drive自体にリクエストごとの課金はありません。
例
フォルダの中で今週変更された文書です。
FROM drive.files
|> WHERE 'FOLDER_ID' IN UNNEST(parents)
AND modified_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND NOT trashed
|> SELECT name, modified_time, web_view_link
|> ORDER BY modified_time DESC;各文書をLLMで要約し、要約を1つのファイルとしてアップロードします。
FROM drive.files AS f
|> WHERE 'FOLDER_ID' IN UNNEST(f.parents) AND f.mime_type = 'application/vnd.google-apps.document'
|> JOIN drive.contents AS c ON f.resource = c.resource AND f.version = c.version
|> INFER `model-task:summarise-doc.v1` INPUT (name = f.name, document = c.content) AS s
|> WHERE s.outcome = 'ok'
|> SELECT f.name, s.value.summary AS summary
|> SERIALIZE FORMAT CSV ORDER BY name OPTIONS (name = 'summaries.csv', header = TRUE, null_marker = '')
|> EFFECT STORE drive.files SET (folder = 'FOLDER_ID', name = name, content = content, overwrite = TRUE);前四半期のレポートをアーカイブ用のフォルダに移します。
FROM drive.files
|> WHERE 'REPORTS_FOLDER' IN UNNEST(parents) AND modified_time < '2026-07-01'
|> EFFECT UPDATE drive.files ID id SET (parents = ['ARCHIVE_FOLDER']);Source: actql/actql/docs/connectors/drive.md at d904416674e4 · Edit on GitHub