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

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

インポート プロセス全体の概要は次のとおりです。

  1. インポートを計画する
  2. Chat 用アプリの認可を構成する
  3. インポート モードでスペースを作成する
  4. リソースをインポートする
  5. インポートしたリソースを検証する
  6. インポートされたリソースの差異をソースデータと調整する
  7. 完全インポート モード
  8. インポート モード後にスペースへのアクセス権を付与する
  9. トラブルシューティング

前提条件

Apps Script

Python

インポートを計画する

インポートするデータ量を適切に計画し、使用量の上限と割り当てがインポート プロセスにどのように影響するかを理解し、新しいスペースにインポートする際にサポートされる Chat スペースの種類を把握します。管理者の方は、別のサービスから Google Chat にメッセージ データをインポートするをお読みになり、手順に沿って慎重に進めてください。

API の使用上限を確認する

Chat へのデータのインポートにかかる時間は、インポートする Chat リソースの量によって大きく異なります。Chat 用アプリの使用量の上限と、移行元のメッセージング プラットフォームからインポートする予定のデータ量を確認して、推定タイムラインを決定します。

スペースにメッセージをインポートする場合は、messages.create() メソッドへの呼び出しをさまざまなメッセージ スレッドに分散することをおすすめします。

インポートするサポート対象のスペースを特定する

インポート モードでは、SPACEGROUP_CHATSpaceType のみがサポートされます。DIRECT_MESSAGE はサポートされていません。詳細については、SpaceType のドキュメントをご覧ください。

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

インポート モードでスペースを作成するには、Space リソースcreate メソッドを呼び出し、importModetrue に設定します。

インポート モードでスペースを作成する場合は、次の点に注意してください。

  • 日付と時刻 - インポート モードは 90 日以内に完了する必要があります。spaces.create() メソッドの呼び出しから 90 日が経過してもスペースがインポート モードのままの場合、スペースは自動的に削除され、アクセスも復元もできなくなります。
    • importModeExpireTime フィールドの値を使用して、90 日間の期限切れを追跡します。
    • createTime フィールドの値を使用して、90 日間の期限切れを追跡しないでください。これは、spaces.create() メソッドを呼び出す場合と常に同じではありません。インポート モードを使用する場合、元の作成時刻を保持するために、createTime フィールドをソースでスペースが作成された過去のタイムスタンプに設定できます。
  • スペース リソース名(name - 特定のスペースに関する情報を取得するために使用される一意の識別子。スペースにコンテンツをインポートする際、後の手順で参照されます。

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

インポート モードで外部スペースを作成するには、externalUserAllowedtrue に設定します。インポートが正常に完了したら、外部ユーザーを追加できます。

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

Apps Script

function createSpaceInImportMode() {
  const space = Chat.Spaces.create({
      spaceType: 'SPACE',
      displayName: 'DISPLAY_NAME',
      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': 'DISPLAY_NAME',
            'importMode': True,
            'createTime': f'{datetime.datetime(2000, 1, 1).isoformat()}Z',
        }
    )
    .execute()
)

print(result)

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

  • EMAIL: ドメイン全体の権限でユーザーを偽装しているユーザー アカウントのメールアドレス。
  • DISPLAY_NAME: インポート モードで作成されたスペースの名前。これは、Chat ユーザーに表示されるスペースの一意の名前である必要があります。データをインポートするスペースと同じ表示名を使用することをおすすめします。

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

他のメッセージング プラットフォームからリソースをインポートするには、インポート モードのスペースに 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 より前で、スペースの作成日時以降である必要があります。この情報は、データ保持期間の決定には使用されず、Google 管理コンソールや Google Vault などの管理ツールには表示されません。createTime

元のメッセージ プラットフォームでは、ユーザーがスペースに参加したり退出したりする方法が複数ある可能性があります(招待、ユーザー自身による参加、他のユーザーによる追加など)。しかし、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)

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

外部スペースでリソースをインポートする

インポート モードで外部スペースを作成できるのは、Google Workspace 組織内のユーザーの認証情報を使用する場合のみです。これは、スペースがインポート モードの場合にのみ適用されます。スペースのインポート モードが完了すると、外部ユーザーをインポートされたスペースに招待できるようになり(アクセス セクションを参照)、その認証情報を使用して Chat API を呼び出すことができます。

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

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

Chat 用アプリは、Message リソースget メソッドを呼び出すことで、検証のために個々のメッセージを読み取ることもできます。チャットアプリは、独自の権限を使用してこのメソッドを呼び出し、独自のメッセージを読み取るだけです。詳しくは、Chat 用アプリを承認するをご覧ください。

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

インポート モードのスペースのプロパティを読み取るには、Space リソースget メソッドを呼び出します。レスポンスには importModeExpireTime も入力されるため、インポート プロセスを完了するまでの期間を適切に追跡できます。チャットアプリは、独自の権限を使用してのみこのメソッドを呼び出すことができます。詳しくは、Chat 用アプリを承認するをご覧ください。

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

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

メッセージ

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

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

リアクション

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

添付ファイル

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

過去のメンバーシップ

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

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

スペース

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

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

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

完全なインポート モード

completeImport メソッドを呼び出す前に、検証リソースの差異の調整が完了していることを確認する必要があります。インポート モードのスペースを終了すると、元に戻すことはできず、インポート モードのスペースは通常のスペースに変換されます。Chat には、これらのスペースをデータ インポートに関連付けるインジケーターはありません。

completeImport を呼び出した日時、通話を行ったユーザーのリソース名、返されたレスポンスをメモします。これは、問題が発生して調査する必要がある場合に役立ちます。

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

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

completeImportimportModeExpireTime の直前に呼び出さないでください。リクエストが importModeExpireTime の前に到着することを保証できないため、有効期限にトリガーされるシステムでのデータ処理と競合する可能性があります。importModeExpireTime の少なくとも 30 分前に 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)

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

インポート モード後にスペースへのアクセスを許可する

Chat ユーザーが最近インポートしたスペースにアクセスできるように、Chat 用アプリは最初の create.space() メソッド呼び出しから 90 日以内であれば、chat.import スコープとユーザーの権限借用を使用して次の操作を行うことができます。

  • スペースにメンバーを追加する: Membership リソースで create() メソッドを呼び出します。Chat 用アプリが chat.import スコープを継続して使用し、インポートされたすべてのメンバーがスペースにアクセスできるように、スペースのインポートが完了したらすぐに Membership リソースを作成することをおすすめします。Vault 保持ポリシーの対象となる可能性のあるメンバーの追加を優先する必要があります。これにより、保持期間外であっても、インポートされたメッセージを保持できます。
  • 対象ユーザーを設定する: Space リソースで update() メソッドを呼び出します。対象グループを作成して追加する方法については、Google Workspace 組織内の特定のユーザーが Google Chat のスペースを検索できるようにするをご覧ください。

chat.import スコープでこれらのメソッドを使用するには、権限借用されたユーザーがスペース管理者である必要があります。

外部スペースの場合、メンバーシップのcreate() メソッドを使用すると、Workspace 組織外のユーザーを招待することもできます。外部ユーザーに関する既知の制限事項をすべて理解していることを確認してください。

トラブルシューティング

Chat スペースのインポート時に問題が発生した場合は、以下の問題を参照してください。エラー レスポンスが発生した場合は、後で参照してトラブルシューティングを行うために、エラー レスポンスをメモしておきます(テキストをコピーしてドキュメントに貼り付けるか、スクリーンショットを保存します)。

スペースが正常にインポートされると、CompleteImportSpace はステータス OK で完了します。

90 日間の猶予期間が終了する前にインポートを完了しなかった

インポート モードでスペースを作成するで説明したように、作成メソッドが呼び出されてから 90 日が経過してもスペースがインポート モードのままの場合、スペースは自動的に削除され、アクセスも復元もできなくなります。

削除されたスペースは使用できなくなり、復元もできなくなります。インポート プロセスを再度開始する必要があります。

現在の使用量の上限では、90 日間の期間内にインポートできるデータ量が多すぎるため、スペースがインポートされなかった場合は、アーカイブ用にスペースを 2 つ以上の小さなスペースに分割し、インポート プロセスを再度開始します。

スペースがない

新しい Chat スペースが見つからない場合は、CompleteImportSpace から受け取ったレスポンスについて、次の表で説明と解決方法をご確認ください。

回答を受信しました 調査手順 説明 解決策
CompleteImportSpace は例外をスローし、GetSpace を呼び出すと PERMISSION_DENIED が返されます。 スペースが作成された日時を記録で確認します。90 日以上経過している場合は、自動的に削除されています。また、インポートされたスペースの記録は、スペース管理ツール監査ログにはありません。 インポート プロセスが開始されてから 90 日以上経過しているにもかかわらず、スペースが移行を正常に終了できませんでした。 新しいスペースを作成して、インポート プロセスを再度実行します。
CompleteImportSpaceOK を返し、GetSpace を呼び出すと PERMISSION_DENIED が返されます。 インポートされたスペースの記録はスペース管理ツールにありませんが、スペースが削除されたことは監査ログに記録されています。 スペースは正常にインポートされましたが、その後削除されました。 新しいスペースを作成して、インポート プロセスを再度実行します。