Google ドライブ: 共有リンク削除

Google Drive: Delete Shared Link

この工程は、Google ドライブ の指定ファイルやフォルダから、リンクを知っている全員、もしくはドメイン内の全員がアクセスできる共有リンクを削除します。ユーザやグループへのアクセス許可は削除されずに残ります。

Auto Step icon
Basic Configs
工程名
メモ
Configs for this Auto Step
conf_User
C1: Google ドライブ に接続するユーザ (要アプリ管理権限) *
conf_FileId
C2: 共有リンクを削除するファイル/フォルダの ID *

Notes

  • C1 のユーザは、[アカウント設定]>[Google 連携]にて、Google ドライブと連携済みである必要があります
    • ワークフロー基盤にて、Google 連携設定([システム設定]>[Google 連携])が必要です(要[システム管理権限])
  • 「Google ドライブ: ファイルアップロード」「Google ドライブ: フォルダ作成」「Google スプレッドシート: ファイル作成」で作成されたファイル・フォルダの、共有リンクを削除可能です。
    • 既存のファイルや他のソフトウェアが作成したファイルは共有リンクを削除できません。
    • 認可スコープが ​https://www.googleapis.com/auth/drive.file であるためです。

Capture

See also

Script (click to open)
  • 次のスクリプトが記述されている XML ファイルをダウンロードできます
    • google-drive-permission-delete.xml (C) Questetra, Inc. (MIT License)
    • Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます


main();

function main() {
    const quser = getQuser();
    const fileId = getFileId();
    const permissionId = getPermissionIdToDelete(quser, fileId);
    deletePermission(quser, fileId, permissionId);
}

/**
 * 実行ユーザを取得する
 * @return {QuserView} 実行ユーザ
 */
function getQuser() {
    const quser = configs.getObject("conf_User");
    if (quser === null) {
        throw "User not found.";
    }
    engine.log(`User Name: ${quser.getName()}`);
    return quser;
}

/**
 * データ項目からファイル / フォルダの ID を取得する
 * @return {String}  ファイル / フォルダの ID
 */
function getFileId() {
    const fileId = engine.findData(configs.getObject("conf_FileId"));
    if (fileId === null || fileId === "") {
        throw "File / Folder ID isn't set.";
    }
    return fileId;
}

/**
  * Google Drive API にファイル/フォルダの共有設定一覧を取得する GET リクエストを送信し、
  * 削除対象の共有設定の ID を返す
  * type が anyone または domain のものが削除対象
  * 削除対象の共有設定がない場合はエラー
  * @param {QuserView} quser  Google Drive に接続するユーザ
  * @param {String} fileId  ファイルの ID
  * @return {String} permissionId  削除する共有設定の ID
  */
function getPermissionIdToDelete(quser, fileId) {
    const url = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}/permissions`;
    const response = httpClient.begin()
        .googleOAuth2(quser, "Drive")
        .queryParam("fields", "permissions/id,permissions/type")
        .queryParam("supportsAllDrives", "true")
        .get(url);
    const status = response.getStatusCode();
    const responseStr = response.getResponseAsString();
    if (status >= 300) {
        engine.log(responseStr)
        throw `Failed to get permission list. File:${fileId}, Status:${status}`;
    }
    const {permissions} = JSON.parse(responseStr);
    const permissionIds = permissions
        .filter(permission => permission.type === "anyone" || permission.type === "domain")
        .map(permission => permission.id);
    if (permissionIds.length === 0) {
        throw `No shared link to delete. File:${fileId}`;
    }
    // Web UI から設定できる anyone / domain の共有設定は 1 つのみ
    // 共有設定作成の API を直接叩けば anyone / domain の共有設定を複数作成できるが、ここでは考慮しない
    // もし複数ある場合は 1 つ目だけ削除
    return permissionIds[0];
}

/**
  * Google Drive API に DELETE リクエストを送信し、共有設定を削除する
  * @param {QuserView} quser  Google Drive に接続するユーザ
  * @param {String} fileId  ファイル ID
  * @param {String} permissionId  削除する共有設定の ID
  */
function deletePermission(quser, fileId, permissionId) {
    const url = `https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}/permissions/${permissionId}`;
    const response = httpClient.begin()
        .googleOAuth2(quser, "Drive")
        .queryParam("supportsAllDrives", "true")
        .delete(url);
    const status = response.getStatusCode();
    if (status >= 300) {
        engine.log(response.getResponseAsString())
        throw `Failed to delete permission. File:${fileId}, Permission:${permissionId}, Status:${status}`;
    }
}

    
%d人のブロガーが「いいね」をつけました。