Google Chat にデータをインポートする

Google Chat API を使用すると、他のメッセージング プラットフォームから Google Chat にデータをインポートできます。既存のメッセージ、添付ファイル、リアクション、メンバーシップ、スペース エンティティを他のメッセージング プラットフォームから、対応する Chat API リソースにインポートできます。このデータをインポートするには、インポート モードで Chat スペースを作成し、それらのスペースにデータをインポートします。プロセスが正常に完了すると、これらのスペースは標準の Chat スペースになります。

  1. API の使用量上限を確認し、事前に計画します
  2. Chat 用アプリの認可を構成します
  3. インポート モードでスペースを作成します
  4. リソースをインポートする
  5. インポートされたリソースを検証する
  6. インポートされたリソースのソースデータとの差異を調整する
  7. インポート モードを完了します
  8. メンバーシップ リソースを作成する

前提条件

Apps Script

  • Google Chat へのアクセス権を持つ Google Workspace アカウント。
  • 公開された Chat アプリ。Chat アプリを作成するには、このquickstartに沿って操作してください。

Python

  • Python 3.6 以降
  • pip パッケージ管理ツール
  • 最新の Python 用 Google クライアント ライブラリ。インストールまたは更新するには、コマンドライン インターフェースで次のコマンドを実行します。

    pip3 install --upgrade google-api-python-client google-auth
    
  • 公開された Chat アプリ。Chat アプリを作成して公開するには、Google Chat アプリを作成するをご覧ください。

  • Chat アプリに認可が構成されています。アプリがコンテンツをインポートするすべてのドメインで、ドメイン全体の権限が委任されている必要があります。Chat 用アプリを承認するをご覧ください。

API の使用量上限を確認し、事前に計画する

Chat へのデータのインポートに必要な時間は、インポートする Chat リソースの量によって大きく異なります。Chat アプリの使用量上限と、ソース メッセージング プラットフォームからインポートするようにスケジュールされているデータの量を確認して、推定タイムラインを決定し、事前に計画を立てます。

インポート モードでスペースを作成する

インポート モードでスペースを作成するには、Space リソースcreate メソッドを呼び出し、importModetrue に設定します。ソース メッセージング プラットフォームから同等のスペース エンティティの作成時刻を保持するには、スペースの createTime を設定します。この createTime には、2000 年 1 月 1 日から現在までの値を設定する必要があります。

作成するスペースの name をメモして、後の手順でスペースにコンテンツをインポートする際に参照できるようにします。

create メソッドが呼び出されてから 30 日間、Chat アプリはスペースにリソースをインポートし、インポート モードを完了し、chat.import スコープを使用してメンバーシップ リソースを作成します。Chat アプリでは、標準の Chat API のメンバーシップ スコープを使用して、30 日後にメンバーシップを作成できます。30 日が経過してもスペースがインポート モードの場合、そのスペースは自動的に削除され、アクセスも復元もできなくなります。Chat アプリの使用量上限を確認して、スケジュールされているすべてのリソースをこの期間内に Chat にインポートできるように、事前に計画を立てます。

次の例は、インポート モードでスペースを作成する方法を示しています。

Apps Script

function createSpaceInImportMode() {
  const space = Chat.Spaces.create({
      spaceType: 'SPACE',
      displayName: 'Import Mode Space',
      importMode: true,
      createTime: (new Date('January 1, 2000')).toJSON()
  });
  console.log(space.name);
}

Python

"""Create a space in import mode."""

import datetime

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

result = (
    service.spaces()
    .create(
        body={
            'spaceType': 'SPACE',
            'displayName': 'Import Mode Space',
            'importMode': True,
            'createTime': f'{datetime.datetime(2000, 1, 1).isoformat()}Z',
        }
    )
    .execute()
)

print(result)

次のように置き換えます。

  • EMAIL: ドメイン全体の権限で権限を借用するユーザー アカウントのメールアドレス。

リソースをインポートする

他のメッセージング プラットフォームからリソースをインポートするには、インポート モードのスペースで Google Chat リソース(メッセージ、リアクション、添付ファイルなど)を作成します。スペースにリソースを作成するときに、移行元のメッセージ プラットフォームの関連リソースのデータを指定します。

メッセージ

Chat アプリは、独自の権限を使用してメッセージをインポートできます。また、なりすましを使用してユーザーに代わってメッセージをインポートすることもできます。(メッセージ作成者は、権限を借用したユーザー アカウントに設定されます)。詳細については、Chat 用アプリを承認するをご覧ください。インポート モードのスペースでメッセージをインポートするには、Message リソースcreate メソッドを呼び出します。ソース メッセージング プラットフォームからの元のメッセージの作成時刻を保持するには、メッセージの createTime を設定します。この createTime には、以前に設定したスペース作成時刻と現在の時刻の間の値を設定する必要があります。

同じスペース内のメッセージに同じ createTime を含めることはできません。たとえ、その時刻の以前のメッセージが削除されても。

インポート モードのスペースでサードパーティの URL を含むメッセージでは、Google Chat 内でリンク プレビューをレンダリングできません。

インポート モードでメッセージを作成する場合、スペースはどのユーザーにも通知やメールの送信を行いません。これには、ユーザーの名前リンクを含むメッセージも含まれます。

次の例は、インポート モードのスペースでメッセージを作成する方法を示しています。

Python

"""Create a message in import mode space."""

import datetime

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

NAME = 'spaces/SPACE_NAME'
result = (
    service.spaces()
    .messages()
    .create(
        parent=NAME,
        body={
            'text': 'Hello, world!',
            'createTime': f'{datetime.datetime(2000, 1, 2).isoformat()}Z',
        },
    )
    .execute()
)

print(result)

次のように置き換えます。

リアクション

Chat アプリは、Chat API を使用してメッセージのリアクションをインポートできます。インポート モードのスペースにおけるリソース メソッドと認証サポートのタイプについては、Chat 用アプリを承認するをご覧ください。

添付ファイル

Chat アプリは、Chat API を使用して添付ファイルをアップロードできます。インポート モードのスペースにおけるリソース メソッドと認証サポートのタイプについては、Chat 用アプリを承認するをご覧ください。ただし、Google Drive API を使用して添付ファイルを Google ドライブ ファイルとしてアップロードし、インポート モードのスペースでファイルの URI をそれぞれのメッセージにリンクして、他のメッセージング プラットフォームから添付ファイルをインポートすることで、添付ファイルのアップロードに関する Google Chat の内部制限に達するのを回避することを強くおすすめします。

過去のメンバーシップ

過去のメンバーシップは、ソース メッセージング プラットフォームから元のスペース エンティティをすでに離脱しているが、Chat にデータを保持する必要があるユーザー用に作成されたメンバーシップです。スペースがインポート モードでなくなった後に新しいメンバーを追加する方法については、メンバーシップ リソースを作成するをご覧ください。

多くの場合、過去のメンバーに Google のデータ保持ポリシーが適用されている場合は、過去のメンバーシップによって作成されたデータ(メッセージやリアクションなど)を Chat にインポートする前にスペースに保持する必要があります。スペースがインポート モードにある間、Membership リソースcreate メソッドを使用すると、これらの過去のメンバーシップをスペースにインポートできます。過去のメンバーシップの休暇期間を保持するには、メンバーシップの deleteTime を設定する必要があります。この休暇時間は、メンバーシップ用に保持するデータに影響するため、正確である必要があります。また、この deleteTime はスペース作成タイムスタンプより後である必要があり、将来のタイムスタンプであってはなりません。

deleteTime に加えて、createTime を設定して、過去のメンバーシップの元の参加時刻を保持することもできます。deleteTime とは異なり、createTime は省略可能です。未設定の場合、createTimedeleteTime から 1 マイクロ秒を差し引いて自動的に計算されます。設定する場合は、createTimedeleteTime より前、かつスペース作成時刻以降にする必要があります。この createTime 情報は、データの保持の決定には使用されず、Google 管理コンソールや Google Vault などの管理ツールには表示されません。

ユーザーがソース メッセージ プラットフォームでスペースに参加、またはスペースから退出する方法は複数ある場合がありますが(招待状、自分自身で参加、別のユーザーによって追加される)場合、Chat ではこれらのアクションはすべて、追加または削除として過去のメンバーシップ createTime フィールドと deleteTime フィールドによって表されます。

次の例は、インポート モードのスペースに過去のメンバーシップを作成する方法を示しています。

Python

"""Create a historical membership in import mode space."""

import datetime

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

NAME = 'spaces/SPACE_NAME'
USER = 'users/USER_ID'
result = (
    service.spaces()
    .members()
    .create(
        parent=NAME,
        body={
            'createTime': f'{datetime.datetime(2000, 1, 3).isoformat()}Z',
            'deleteTime': f'{datetime.datetime(2000, 1, 4).isoformat()}Z',
            'member': {'name': USER, 'type': 'HUMAN'},
        },
    )
    .execute()
)

print(result)

次のように置き換えます。

インポートされたリソースを検証する

Chat アプリでインポート モードのスペースの内容を読み上げ、検証するには、Message リソースlist メソッド を呼び出します。Reaction リソースと Attachment リソースは、返されたメッセージの emojiReactionSummaries フィールドと attachment フィールドから読み取ることができます。Chat アプリは、なりすましによってのみ、ユーザーに代わってこのメソッドを呼び出すことができます。詳細については、Chat 用アプリを承認するをご覧ください。

Chat アプリでは、Message リソースget メソッドを呼び出すことで、検証のために個々のメッセージを読み取ることもできます。Chat アプリでは、このメソッドを呼び出して、独自のオーソリティを使用して自身のメッセージを読み取ることのみ可能です。詳細については、Chat 用アプリを承認するをご覧ください。

Chat アプリでは、Membership リソースlist メソッドを呼び出して、過去のメンバーシップを一覧表示することもできます。スペースがインポート モードを終了すると、list メソッドは過去のメンバーシップを公開しなくなります。Chat アプリは、なりすましによってユーザーに代わってこのメソッドを呼び出すことができます。詳細については、Chat 用アプリを承認するをご覧ください。

インポート モードのスペースのプロパティを読み取るには、Space リソースget メソッドを呼び出します。Chat アプリは、独自の権限でのみこのメソッドを呼び出すことができます。 詳細については、Chat 用アプリを承認するをご覧ください。

インポートされたリソースのソースデータとの差異を調整する

インポート中に元のエンティティが変更されたため、インポートされたリソースがソース メッセージング プラットフォームの元のエンティティと一致しなくなった場合、チャットアプリは Chat API を呼び出して、インポートされたチャット リソースを変更できます。たとえば、Chat でメッセージが作成された後にユーザーがソース メッセージング プラットフォームでメッセージを編集すると、Chat アプリはインポートされたメッセージを更新して、元のメッセージの現在のコンテンツを反映できます。

メッセージ

インポート モードのスペース内のメッセージでサポートされているフィールドを更新するには、Message リソースupdate メソッドを呼び出します。Chat アプリでは、最初のメッセージの作成時に使用したのと同じオーソリティを使用してのみ、このメソッドを呼び出すことができます。最初のメッセージの作成時にユーザーの権限借用を使用した場合は、同じ権限を借用したユーザーを使用してメッセージを更新する必要があります。

インポート モードのスペース内のメッセージを削除するには、Message リソースdelete メソッドを呼び出します。インポート モードのスペース内のメッセージは、元のメッセージ作成者が削除する必要はありません。ドメイン内の任意のユーザーになりすますことで削除できます。Chat アプリでは、自身の権限でのみメッセージを削除できます。詳細については、Chat 用アプリを承認するをご覧ください。

リアクション

インポート モードのスペース内のメッセージに対するリアクションを削除するには、reactions リソースの delete メソッドを使用します。インポート モードのスペースにおけるリソース メソッドと認証サポートのタイプについては、Chat 用アプリを承認するをご覧ください。

添付ファイル

インポート モードのスペースでメッセージの添付ファイルを更新するには、media リソースの upload メソッドを使用します。インポート モードのスペースにおけるリソース メソッドと認証サポートの種類については、Chat 用アプリを承認するをご覧ください。

過去のメンバーシップ

インポート モードのスペースの履歴メンバーシップを削除するには、Membership リソースdelete メソッドを使用します。スペースがインポート モードを終了すると、delete メソッドで過去のメンバーシップを削除できなくなります。

インポート モードのスペースでは、過去のメンバーシップは更新できません。誤ってインポートされた過去のメンバーシップを修正する場合は、まずそのメンバーシップを削除してから、スペースがインポート モードのときに再作成する必要があります。

スペース

インポート モードのスペースでサポートされているフィールドを更新するには、spaces リソースの patch メソッドを使用します。

インポート モードのスペースを削除するには、spaces リソースの delete メソッドを使用します。

インポート モードのスペースにおけるリソース メソッドとサポートの種類については、Chat 用アプリを承認するをご覧ください。

インポート モードを完了

completeImport メソッドを呼び出す前に、検証リソースの違いの調整が完了していることを確認してください。スペースのインポート モードを終了すると元に戻せません。インポート モードのスペースは通常のスペースに変換されます。Chat には、これらのスペースがデータ インポートに結び付いていることを示すインジケーターは表示されません。

インポート モードを完了して、ユーザーがスペースにアクセスできるようにするために、Chat アプリは Space リソースcompleteImport メソッドを呼び出します。Chat アプリは、なりすましによってのみ、ユーザーに代わってこのメソッドを呼び出すことができます。詳細については、Chat 用アプリを承認するをご覧ください。このメソッドが完了すると、権限を借用したユーザーがスペースの管理者としてスペースに追加されます。このメソッドは、最初の create.space メソッド呼び出しから 30 日以内に呼び出す必要があります。30 日が経過した後にこのメソッドを呼び出そうとすると、インポート モードのスペースが削除され、Chat アプリからアクセスできなくなるため、呼び出しが失敗します。

completeImport メソッドで権限を借用するユーザーは、スペースの作成者である必要はありません。

次の例は、インポート モードを完了する方法を示しています。

Python

"""Complete import."""

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

NAME = 'spaces/SPACE_NAME'
result = service.spaces().completeImport(name=NAME).execute()

print(result)

次のように置き換えます。

メンバーシップ リソースを作成する

インポート モードを完了したスペースにユーザー メンバーシップを追加するには、Membership リソースcreate メソッドを呼び出します。Chat アプリでは、最初の create.space メソッド呼び出しから 30 日以内であれば、引き続き chat.import スコープとユーザーの権限借用を使用してこのメソッドを呼び出すことができます。権限を借用するユーザーはスペースの管理者である必要があります。

30 日間の経過後に Chat アプリでこのメソッドを呼び出すには、追加のメンバーシップ スコープが必要です。

Chat アプリでは、インポートの完了後すぐにメンバーシップ リソースを作成することをおすすめします。これにより、Chat アプリで引き続き chat.import スコープを使用してメンバーシップを作成し、インポートされたスペースへのアクセスをすべてのメンバーに提供できます。