2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Apps Script でGoogle Driveの更新履歴を取得する

Posted at

Google Apps ScriptでGoogle Driveの更新履歴を取得するコードを作成しました
使い方は以下関数testのように、getFilesAfterSpecifiedDateを呼んで、確認対象のフォルダIDをいつから検索するのかだけ指定すれば実行出来ます

利用スコープについて

本スクリプトのappscript.jsonは以下の通りです

appscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "DriveActivity",
        "version": "v2",
        "serviceId": "driveactivity"
      },
      {
        "userSymbol": "People",
        "version": "v1",
        "serviceId": "peopleapi"
      }
    ]
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/contacts",
    "https://www.googleapis.com/auth/contacts.readonly",
    "https://www.googleapis.com/auth/directory.readonly",
    "https://www.googleapis.com/auth/user.addresses.read",
    "https://www.googleapis.com/auth/user.birthday.read",
    "https://www.googleapis.com/auth/user.emails.read",
    "https://www.googleapis.com/auth/user.gender.read",
    "https://www.googleapis.com/auth/user.organization.read",
    "https://www.googleapis.com/auth/user.phonenumbers.read",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/userinfo.profile",
    "https://www.googleapis.com/auth/drive.activity.readonly",
    "https://www.googleapis.com/auth/contacts.readonly"
  ],
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

追加するサービスについて

Google Apps scriptのエディタで以下2つのサービスを追加します

  • DriveActivity v2
  • People v1

実際のコードについて

以下に掲載します

app.gs
function test() {

  // 検索条件指定 getFilesAfterSpecifiedDate("対象フォルダID","検索開始日時")
  const results = DriveActivityService.getFilesAfterSpecifiedDate(
    "",
    new Date("2021/01/01")
  )

  // 検索結果確認
  results.forEach(result => {
    console.log(result);
  })
}

/**
 * アクティビティ変換後のファイル形式
 * @typedef {Object} FileModel
 * @property {string} fileId
 * @property {Date} lastUpdate
 * @property {string} fileType
 * @property {string} title
 * @property {string} url
 * @property {string} actor
 * @property {string} actorAddress
 */

class DriveActivityService {

  /**
   * 最終更新日が指定日より後のファイル一覧を出力する
   * @param {string} folderId
   * @param {Date} specifiedDate
   * @returns {FileModel[]}
   */
  static getFilesAfterSpecifiedDate(folderId, specifiedDate) {
    const { activities } = DriveActivity.Activity.query({
      ancestorName: `items/${folderId}`,
      filter: `time > ${specifiedDate.getTime()}`,
    })
    return activities.map(e => this._getFileModelFromActivity(e));
  }

  /**
   * ActivityよりModelを生成する
   * @param {Driveactivity_v2.Driveactivity.V2.Schema.DriveActivity} activity
   * @returns {FileModel}
   */
  static _getFileModelFromActivity(activity) {
    const item = activity.targets[0].driveItem;
    const knownUser = activity.actors[0].user.knownUser.personName;
    const fileId = item.name.replace("items/", "");
    const { url, fileType } = this._getMIMETypeAndUrlFromENUM(item.mimeType, fileId);

    const user = this._getUserNameFromPeopleId(knownUser);
    return {
      fileId: fileId,
      fileType: fileType,
      title: item.title,
      url: url,
      actor: user.actor,
      actorAddress: user.actorAddress,
      lastUpdate: new Date(activity.timestamp),
    }
  }

  /**
   * PeopleIDを元にユーザー名を返す
   * @param {string} peopleId
   * @returns {{actor:string,actorAddress:string}}
   */
  static _getUserNameFromPeopleId(peopleId) {

    const people = People.People.getBatchGet({
      resourceNames: [peopleId],
      personFields: "names,emailAddresses"
    });
    if (people.responses[0].person.names === undefined) {
      return { actor: "情報なし", actorAddress: "情報なし" };
    } else {
      return {
        actor: people.responses[0].person.names[0].displayName,
        actorAddress: people.responses[0].person.emailAddresses[0].value,
      }
    }
  }

  /**
   * MIMETypeをファイル形式に変換とURLを生成する
   * @param {string} rowEnum
   * @param {string} fileId
   * @returns {{url:string,fileType:string}}
   */
  static _getMIMETypeAndUrlFromENUM(rowEnum, fileId) {
    if (rowEnum === MimeType.GOOGLE_DOCS) {
      return { url: `https://docs.google.com/document/d/${fileId}`, fileType: "Google Document", };
    } else if (rowEnum === MimeType.GOOGLE_FORMS) {
      return { url: `https://docs.google.com/forms/d/${fileId}`, fileType: "Google Form" };
    } else if (rowEnum === MimeType.GOOGLE_SHEETS) {
      return { url: `https://docs.google.com/spreadsheets/d/${fileId}`, fileType: "Google Spreadsheet" };
    } else if (rowEnum === MimeType.GOOGLE_SITES) {
      return { url: `https://sites.google.com/d/${fileId}`, fileType: "Google Site" };
    } else if (rowEnum === MimeType.GOOGLE_SLIDES) {
      return { url: `https://docs.google.com/presentation/d/${fileId}`, fileType: "Google Slide" };
    } else if (rowEnum === MimeType.FOLDER) {
      return { url: `https://drive.google.com/drive/folders/${fileId}`, fileType: "Folder" };
    } else if (rowEnum === MimeType.SHORTCUT) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "SHORTCUT" };
    } else if (rowEnum === MimeType.BMP) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "BMP" };
    } else if (rowEnum === MimeType.GIF) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "GIF" };
    } else if (rowEnum === MimeType.JPEG) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "JPEG" };
    } else if (rowEnum === MimeType.PNG) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "PNG" };
    } else if (rowEnum === MimeType.SVG) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "SVG" };
    } else if (rowEnum === MimeType.PDF) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "PDF" };
    } else if (rowEnum === MimeType.CSV) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "CSV" };
    } else if (rowEnum === MimeType.PLAIN_TEXT) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Text" };
    } else if (rowEnum === MimeType.RTF) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Ritch Text" };
    } else if (rowEnum === MimeType.MICROSOFT_EXCEL) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Microsoft Excel" };
    } else if (rowEnum === MimeType.MICROSOFT_EXCEL_LEGACY) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Microsoft Excel" };
    } else if (rowEnum === MimeType.MICROSOFT_POWERPOINT) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Microsoft Powerpoint" };
    } else if (rowEnum === MimeType.MICROSOFT_POWERPOINT_LEGACY) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Microsoft Powerpoint" };
    } else if (rowEnum === MimeType.MICROSOFT_WORD) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Microsoft Word" };
    } else if (rowEnum === MimeType.MICROSOFT_WORD_LEGACY) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Microsoft Word" };
    } else if (rowEnum === MimeType.ZIP) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Zip" };
    } else if (rowEnum === MimeType.GOOGLE_APPS_SCRIPT) {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "Google Apps Script" };
    } else {
      return { url: `https://drive.google.com/file/d/${fileId}`, fileType: "その他ファイル" };
    }
  }
}

解決していない問題

MimeType.ZIPだけ何故かうまく判定してくれないので、そのうちファイル形式ZIPが判定出来るようになったら更新します

以上

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?