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 スペースのタイプに注意してください。

API の使用量上限を確認する

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

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

インポートするサポートされているスペースを特定する

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

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

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

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

  • 日時 - インポート モードは 30 日以内に完了する必要がありますspaces.create() メソッドが呼び出されてから 30 日が経過してもスペースがインポート モードのままである場合、スペースは自動的に削除され、アクセスできなくなり、復元できなくなります。
    • 30 日間の有効期限の終了を追跡するために、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 Drive API を使用して添付ファイルを Google ドライブ ファイルとしてアップロードし、ファイルの URI をインポート モードのスペース内のそれぞれのメッセージにリンクして、他のメッセージング プラットフォームから添付ファイルをインポートすることを強くおすすめします。これにより、Google Chat の添付ファイルのアップロードに関する内部上限に達するのを回避できます。

過去のメンバーシップ

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

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

deleteTime に加えて、createTime を設定すると、過去のメンバーシップの元の参加時間を保持できます。deleteTime とは異なり、createTime は省略可能です。未設定の場合、deleteTime から 1 マイクロ秒を減算して createTime が自動的に計算されます。設定する場合、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 アプリは、なりすましによってユーザーに代わってこのメソッドを呼び出すことができます。詳細については、Chat アプリを承認するをご覧ください。

インポート モードのスペースのプロパティを読み取るには、Space リソースget メソッドを呼び出します。チャットアプリは、独自の権限を使用してのみこのメソッドを呼び出すことができます。詳細については、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 メソッド呼び出しから 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)

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

インポート モード後にスペースへのアクセス権を付与する

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

  • スペースにメンバーを追加する: Membership リソースで create() メソッドを呼び出します。Chat アプリが chat.import スコープを引き続き使用できるようにし、インポートされたすべてのメンバーがスペースにアクセスできるようにするため、Chat アプリはスペースのインポートが完了した直後に Membership リソースを作成することをおすすめします。
  • 対象グループを設定する: Space リソースで update() メソッドを呼び出します。対象グループを作成して追加する方法については、Google Workspace 組織の特定のユーザーが Google Chat スペースを検出できるようにするをご覧ください。

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

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

トラブルシューティング

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

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

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

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

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

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

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

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