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

移行元のメッセージ プラットフォームの同等のスペース エンティティの作成時間を保持するには、スペースの 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 Chat の内部上限に達しないように、Google Drive API を使用して添付ファイルを Google ドライブ ファイルとしてアップロードし、ファイルの URI をインポート モードのスペース内のそれぞれのメッセージにリンクして、他のメッセージング プラットフォームから添付ファイルをインポートすることを強くおすすめします。

過去のメンバーシップ

過去のメンバーシップは、移行元のメッセージ プラットフォームの元のスペース エンティティからすでに離脱しているユーザーに対して作成されるメンバーシップで、そのユーザーのデータを 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)

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

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

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

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

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

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

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

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

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

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

メッセージ

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

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

リアクション

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

添付ファイル

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

過去のメンバーシップ

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

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

スペース

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

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

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

完全インポート モード

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

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

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

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

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

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

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

トラブルシューティング

チャット スペースのインポートで問題が発生した場合は、次の問題をご確認ください。エラー レスポンスが発生した場合は、今後の参照とトラブルシューティングのためにメモします(テキストをドキュメントにコピー/貼り付けるか、スクリーンショットを保存します)。

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

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

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

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

不足しているスペースを見つける

新しい Chat スペースが見つからない場合は、次の表で CompleteImportSpace から返された回答を確認し、説明と解決方法を確認してください。

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