Google Chat API を使用すると、他のメッセージング プラットフォームから Google Chat にデータをインポートできます。他のメッセージング プラットフォームから、既存のメッセージ、添付ファイル、リアクション、メンバーシップ、スペース エンティティを対応する Chat API リソースにインポートできます。このデータをインポートするには、インポート モードで Chat スペースを作成し、そのスペースにデータをインポートします。この処理が正常に完了すると、これらのスペースは標準の Chat スペースになります。
インポート プロセス全体の概要は次のとおりです。
- インポートを計画する
- Chat 用アプリの認可を構成する
- インポート モードでスペースを作成する
- リソースをインポートする
- インポートしたリソースを検証する
- インポートされたリソースの差異をソースデータと調整する
- 完全インポート モード
- インポート モード後にスペースへのアクセス権を付与する
- トラブルシューティング
前提条件
Apps Script
- Google Chat へのアクセス権を持つ Business または Enterprise の Google Workspace アカウント。
- Google Cloud プロジェクトを作成します。
- Chat 用アプリの名前、アイコン、説明を使用して、Google Chat API を有効にして構成します。
- スタンドアロンの Apps Script プロジェクトを作成し、高度な Chat サービスを有効にします。
- Chat 用アプリは、アプリがコンテンツをインポートするすべてのドメインでドメイン全体の権限を委任されている必要があります。Chat 用アプリの承認をご覧ください。
Python
- Google Chat へのアクセス権を持つ Business または Enterprise の Google Workspace アカウント。
- Google Cloud プロジェクトを作成します。
- Chat 用アプリの名前、アイコン、説明を使用して、Google Chat API を有効にして構成します。
- Python 3.6 以降
- pip パッケージ管理ツール
- Chat 用アプリは、アプリがコンテンツをインポートするすべてのドメインでドメイン全体の権限を委任されている必要があります。Chat 用アプリの承認をご覧ください。
インポートを計画する
インポートするデータ量を適切に計画し、使用量の上限と割り当てがインポート プロセスにどのように影響するかを理解し、新しいスペースにインポートする際にサポートされる Chat スペースの種類を把握します。管理者の方は、別のサービスから Google Chat にメッセージ データをインポートするをお読みになり、手順に沿って慎重に進めてください。
API の使用上限を確認する
Chat へのデータのインポートにかかる時間は、インポートする Chat リソースの量によって大きく異なります。Chat 用アプリの使用量の上限と、移行元のメッセージング プラットフォームからインポートする予定のデータ量を確認して、推定タイムラインを決定します。
スペースにメッセージをインポートする場合は、messages.create()
メソッドへの呼び出しをさまざまなメッセージ スレッドに分散することをおすすめします。
インポートするサポート対象のスペースを特定する
インポート モードでは、SPACE
と GROUP_CHAT
の SpaceType
のみがサポートされます。DIRECT_MESSAGE
はサポートされていません。詳細については、SpaceType
のドキュメントをご覧ください。
インポート モードでスペースを作成する
インポート モードでスペースを作成するには、Space
リソースの create
メソッドを呼び出し、importMode
を true
に設定します。
インポート モードでスペースを作成する場合は、次の点に注意してください。
- 日付と時刻 - インポート モードは 90 日以内に完了する必要があります。
spaces.create()
メソッドの呼び出しから 90 日が経過してもスペースがインポート モードのままの場合、スペースは自動的に削除され、アクセスも復元もできなくなります。importModeExpireTime
フィールドの値を使用して、90 日間の期限切れを追跡します。createTime
フィールドの値を使用して、90 日間の期限切れを追跡しないでください。これは、spaces.create()
メソッドを呼び出す場合と常に同じではありません。インポート モードを使用する場合、元の作成時刻を保持するために、createTime
フィールドをソースでスペースが作成された過去のタイムスタンプに設定できます。
- スペース リソース名(
name
) - 特定のスペースに関する情報を取得するために使用される一意の識別子。スペースにコンテンツをインポートする際、後の手順で参照されます。
ソース メッセージング プラットフォームの同等のスペース エンティティの作成時間を保持するには、スペースの createTime
を設定します。この createTime
は、2000 年 1 月 1 日から現在までの値に設定する必要があります。
インポート モードで外部スペースを作成するには、externalUserAllowed
を true
に設定します。インポートが正常に完了したら、外部ユーザーを追加できます。
次の例は、インポート モードでスペースを作成する方法を示しています。
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)
次のように置き換えます。
EMAIL
: ドメイン全体の権限でユーザー アカウントを偽装しているメールアドレス。SPACE_NAME
: インポート モードで作成されたスペースの名前。
リアクション
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
は省略可能です。設定されていない場合、createTime
は deleteTime
から 1 マイクロ秒を減算して自動的に計算されます。設定されている場合、createTime
は deleteTime
より前で、スペースの作成日時以降である必要があります。この情報は、データ保持期間の決定には使用されず、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)
次のように置き換えます。
EMAIL
: ドメイン全体の権限でユーザー アカウントを偽装しているメールアドレス。SPACE_NAME
: インポート モードで作成されたスペースの名前。USER_ID
: ユーザーの一意の ID。
外部スペースでリソースをインポートする
インポート モードで外部スペースを作成できるのは、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
メソッドのユーザーの権限借用は、スペースの作成者である必要はありません。
completeImport
を importModeExpireTime
の直前に呼び出さないでください。リクエストが 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)
次のように置き換えます。
EMAIL
: ドメイン全体の権限でユーザー アカウントを偽装しているメールアドレス。SPACE_NAME
: インポート モードで作成されたスペースの名前。
インポート モード後にスペースへのアクセスを許可する
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 日以上経過しているにもかかわらず、スペースが移行を正常に終了できませんでした。 | 新しいスペースを作成して、インポート プロセスを再度実行します。 |
CompleteImportSpace は OK を返し、GetSpace を呼び出すと PERMISSION_DENIED が返されます。 |
インポートされたスペースの記録はスペース管理ツールにありませんが、スペースが削除されたことは監査ログに記録されています。 | スペースは正常にインポートされましたが、その後削除されました。 | 新しいスペースを作成して、インポート プロセスを再度実行します。 |