ファイル コンテンツを保護する

Google Drive API では、ファイル コンテンツの制限や、ファイルをダウンロード、印刷、コピーするオプションの禁止など、ファイルの変更を防止する複数の方法がサポートされています。

ドライブのコンテンツの制限を使用してファイルを読み取り専用にする

Google ドライブ ファイルにコンテンツの制限を追加すると、ユーザーが次の操作を行えなくなります。

  • タイトルの変更
  • コンテンツの編集
  • リビジョンのアップロード
  • コメントの追加または変更

コンテンツの制限を適用すると、アイテムのアクセス権限を変更せずに、ドライブ アイテムのコンテンツを読み取り専用にできます。つまり、アクセス制限ではありません。ユーザーはファイルの内容を変更できませんが、その他の操作はアクセスレベルに基づいて許可されます(たとえば、編集権限を持つユーザーはアイテムの移動や共有設定の変更ができます)。

ドライブ内のファイルにコンテンツの制限を追加または削除するには、関連する権限が必要です。マイドライブまたは共有ドライブ内のファイルまたはフォルダに capabilities.canModifyEditorContentRestriction が設定されている場合、role=writer が割り当てられている必要があります。マイドライブまたは共有ドライブ内のファイルまたはフォルダに ownerRestricted コンテンツ制限が適用されている場合は、そのファイルの所有者であるか、role=organizer 権限を持っている必要があります。コンテンツ制限のあるアイテムを表示するには、ユーザーが role=reader 以上の権限を持っている必要があります。ロールの一覧については、ロールと権限をご覧ください。ファイルの権限を変更するには、権限を変更するをご覧ください。

コンテンツの制限を設定するには、files リソースの contentRestrictions.readOnly ブール値フィールドを使用します。アイテムにコンテンツの制限を設定すると、既存の制限が上書きされます。

コンテンツ制限のシナリオ

ドライブのアイテムにコンテンツの制限を適用すると、そのコンテンツを変更しないようユーザーに通知できます。原因としては次のようなものが考えられます。

  • レビュー時や監査時に共同編集ドキュメントの作業を一時停止する。
  • アイテムを承認済みなどの最終状態に設定する。
  • 機密性の高い会議中の変更を防ぐ。
  • 自動化されたシステムによって処理されるワークフローの外部変更を禁止する。
  • Google Apps Script と Google Workspace アドオンによる編集の制限。
  • ドキュメントの意図しない編集を防ぐ。

ただし、コンテンツの制限はコンテンツの管理に役立ちますが、十分な権限を持つユーザーがアイテムの作業を続行できないようにするためのものではありません。また、不変のレコードを作成することもできません。ドライブのコンテンツ制限は変更可能であるため、アイテムに対するコンテンツ制限があっても、アイテムが変更されないことを保証するものではありません。

コンテンツの制限のあるファイルを管理する

Google ドキュメント、Google スプレッドシート、Google スライド、およびその他のすべてのファイルには、コンテンツの制限を含めることができます。

アイテムのコンテンツ制限により、タイトルやコンテンツには以下のような変更ができなくなります。

  • コメントと提案(ドキュメント、スプレッドシート、スライド、バイナリ ファイル)
  • バイナリ ファイルのリビジョン
  • ドキュメントのテキストと書式設定
  • スプレッドシート内のテキストまたは数式、スプレッドシートのレイアウト、スプレッドシート内のインスタンス
  • スライド内のすべてのコンテンツと、スライドの順序と数

一部のファイル形式にはコンテンツの制限を含めることはできません。以下に例を示します。

コンテンツの制限を追加する

ファイル コンテンツの制限を追加するには、contentRestrictions.readOnly フィールドを true に設定して files.update メソッドを使用します。制限を追加する理由(「契約の確定」など)を示す reason を追加します(省略可)。次のコードサンプルは、コンテンツの制限を追加する方法を示しています。

Java

File updatedFile =
  new File()
      .setContentRestrictions(
          ImmutableList.of(new ContentRestriction().setReadOnly(true).setReason("Finalized contract."));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Python

content_restriction = {'readOnly': True, 'reason':'Finalized contract.'}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Set a content restriction on a file.
* @return{obj} updated file
**/
async function addContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': True,
    'reason': 'Finalized contract.',
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

FILE_ID は、変更するファイルの fileId に置き換えます。

サンプルコードを実行すると、ファイルの内容が制限され、Google ドライブのユーザー インターフェース(UI)でファイル名の横に鍵記号()が表示されます。ファイルは読み取り専用になりました。

ドライブ ファイルリスト内のコンテンツ制限が適用されたファイル。
図 1. ドライブのファイルリスト内のコンテンツ制限のあるファイル。

コンテンツの制限を解除する

ファイル コンテンツの制限を削除するには、contentRestrictions.readOnly フィールドを false に設定して files.update メソッドを使用します。次のコードサンプルは、コンテンツの制限を削除する方法を示しています。

Java

File updatedFile =
new File()
    .setContentRestrictions(
        ImmutableList.of(new ContentRestriction().setReadOnly(false));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Python

content_restriction = {'readOnly': False}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Remove a content restriction on a file.
* @return{obj} updated file
**/
async function removeContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': False,
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

FILE_ID は、変更するファイルの fileId に置き換えます。

サンプルコードを実行すると、ファイルのコンテンツ制限が解除されます。

また、ドライブの UI を使用してコンテンツの制限を解除し、コンテンツの編集を許可することもできます(適切な権限がある場合)。これを行うには、次の 2 つの方法があります。

  1. ドライブで、コンテンツ制限が適用されたファイルを右クリックし、[ のロックを解除] をクリックします。

    ドライブのファイルリスト内のファイル コンテンツの制限を削除する。
    図 2. ドライブのファイルリスト内のファイル コンテンツの制限を削除する。
  2. コンテンツ制限のあるファイルを開き、(ロックモード) > [ファイルのロックを解除] をクリックします。

    ドキュメント内のファイル コンテンツの制限を削除する。
    図 3. ドキュメント内のファイル コンテンツの制限を削除する。

コンテンツの制限を確認する

コンテンツの制限を確認するには、返された contentRestrictions フィールドで files.get メソッドを使用します。次のコードサンプルは、コンテンツの制限のステータスを確認する方法を示しています。

Java

File response = driveService.files().get("FILE_ID").setFields("contentRestrictions").execute();

Python

response = drive_service.files().get(fileId="FILE_ID", fields = "contentRestrictions").execute();

Node.js

/**
* Get content restrictions on a file.
* @return{obj} updated file
**/
async function fetchContentRestrictions() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  try {
    const response = await service.files.get({
      fileId: 'FILE_ID',
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

FILE_ID は、確認するファイルの fileId に置き換えます。

サンプルコードを実行すると、メソッドは ContentRestriction リソースを返します(存在する場合)。

ファイルのオーナーのみが変更できるコンテンツ制限を追加する

ファイル所有者のみがメカニズムを切り替えられるようにファイル コンテンツの制限を追加するには、contentRestrictions.ownerRestricted ブール値フィールドを true に設定して files.update メソッドを使用します。次のコードサンプルは、ファイル所有者のみに対してコンテンツの制限を追加する方法を示しています。

Java

File updatedFile =
  new File()
      .setContentRestrictions(
          ImmutableList.of(new ContentRestriction().setReadOnly(true).setOwnerRestricted(true).setReason("Finalized contract."));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Python

content_restriction = {'readOnly': True, 'ownerRestricted': True, 'reason':'Finalized contract.'}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Set an owner restricted content restriction on a file.
* @return{obj} updated file
**/
async function addOwnerRestrictedContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': True,
    'ownerRestricted': True,
    'reason': 'Finalized contract.',
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

FILE_ID は、変更するファイルの fileId に置き換えます。

サンプルコードを実行すると、ファイルはコンテンツが制限され、ファイルのオーナーのみが削除できます。ファイルのオーナーの場合は、 ドライブのユーザー インターフェース(UI)内のファイル名の横にアクティブなロック シンボル()が表示されます。自分がオーナーでない場合は、ロック アイコンが薄く表示されます。

ownerRestricted フラグを削除するには、contentRestrictions.ownerRestricted フィールドを false に設定して files.update メソッドを使用します。

コンテンツの制限機能

files リソースには、ファイルに対してアクションを実行できるかどうかを示すブール値 capabilities フィールドのコレクションが含まれています。

コンテンツの制限には、次の capabilities が含まれます。

  • capabilities.canModifyEditorContentRestriction: 現在のユーザーがコンテンツの制限を追加または変更できるかどうか。
  • capabilities.canModifyOwnerContentRestriction: 現在のユーザーが所有者のコンテンツの制限を追加または変更できるかどうか。
  • capabilities.canRemoveContentRestriction: 現在のユーザーが適用されたコンテンツ制限(存在する場合)を削除できるかどうか。

詳細については、機能をご覧ください。

ファイル capabilities の取得例については、ユーザー権限を確認するをご覧ください。

ユーザーがファイルをダウンロード、印刷、コピーできないようにする

role=commenter 権限または role=reader 権限を持つユーザーがドライブ、ドキュメント、スプレッドシート、スライド内でファイルをダウンロード、印刷、コピーする方法は制限できます。

ファイルのダウンロード、印刷、コピーのオプションを削除するには、copyRequiresWriterPermission ブール値フィールドを true に設定して files.update メソッドを使用します。