Google Apps ScriptのApps Activity Serviceを使う


# 事前に説明をしておくと…。
## これは何？
[Google Activity API](https://developers.google.com/google-apps/activity/)のラッパーです。そもそもGoogle Activity APIがよくわからなかったのですが、公式ドキュメントに以下のように書いてありました。

* ユーザのファイルのアクティビティを表示
* ファイル、フォルダの変更の追跡
* ファイルへの新しいコメントや変更に対するアラート

これらのデータを受け取るためのAPIのようです。

## これは誰が使うの？
誰が使うのか？というのも公式ドキュメントに書かれてありました。

* すでにGoogle Driveと統合したアプリケーションの開発者
* Google Driveのファイルのユーザの変更を表示したり、追跡したりする。

色々と変更を追跡しないといけない時があったらこのAPIを使って、誰が変更をしたのかを見ることができるということですね。

## もし
新しくGoogleのサービスを使った開発をするか、アプリケーションがGoogle Driveと統合していない場合、始めるためのポイントがわからない場合、[Google Drive API](https://developers.google.com/drive/)を試してみて下さい。

Google Appsについての情報を見る場合は[Google Apps overview](https://developers.google.com/google-apps/)をチェックして下さい。

だ、そうです。

# 本日のサンプルコード

動かす時は、リソース→Googleの拡張サービスで、Google Apps Activity APIを有効にしておいて下さい。当然、 __Developer Consoleでも有効__ にしておきます。

![サービスの有効化.png](https://qiita-image-store.s3.amazonaws.com/0/11925/966f6b4e-9333-dfa9-356d-19bd8c861461.png "サービスの有効化.png")


```js:コード.gs
function getUsersActivity() {
  var fileId = 'Your File ID';

  var pageToken;
  var users = {};
  do {
    var result = AppsActivity.Activities.list({
      'drive.fileId': fileId,
      'source': 'drive.google.com',
      'pageToken': pageToken
    });
    var activities = result.activities;
    for (var i = 0; i < activities.length; i++) {
      var ce = activities[i].combinedEvent;
      Logger.log(ce.additionalEventTypes);
      Logger.log(ce.eventTimeMillis);
      Logger.log(ce.fromUserDeletion);
      if(ce.move) {
        if(ce.move.addedParents) {
          for(var k = 0; k < ce.move.addedParents.length; k++) {
            Logger.log(ce.move.addedParents[k].id);
            Logger.log(ce.move.addedParents[k].isRoot);
            Logger.log(ce.move.addedParents[k].title);
          }
        } else {
          Logger.log(ce.move.addedParents);
        }
        if(ce.move.removedParents) {
          for(var k = 0; k < ce.move.removedParents.length; k++) {
            Logger.log(ce.move.removedParents[k].id);
            Logger.log(ce.move.removedParents[k].isRoot);
            Logger.log(ce.move.removedParents[k].title);
          }
        } else {
          Logger.log(ce.move.removedParents);
        }
      } else {
        Logger.log(ce.move);
      }
      Logger.log(ce.permissionChanges);
      Logger.log(ce.primaryEventType);
      if(ce.rename) {
        Logger.log(ce.rename.newTitle);
        Logger.log(ce.rename.oldTitle);
      } else {
        Logger.log(ce.rename);
      }
      Logger.log(ce.target.id);
      Logger.log(ce.target.mimeType);
      Logger.log(ce.target.name);
      Logger.log(ce.user.name);
      Logger.log(ce.user.photo.url);
      Logger.log("-----------------");
      var events = activities[i].singleEvents;
      for (var j = 0; j < events.length; j++) {
        var se = events[j];
        var event = events[j];
        users[event.user.name] = true;
        Logger.log(se.additionalEventTypes);
        Logger.log(se.eventTimeMillis);
        Logger.log(se.fromUserDeletion);
        if(se.move) {
          if(se.move.addedParents) {
            for(var k = 0; k < se.move.addedParents.length; k++) {
              Logger.log(se.move.addedParents[k].id);
              Logger.log(se.move.addedParents[k].isRoot);
              Logger.log(se.move.addedParents[k].title);
            }
          } else {
            Logger.log(se.move.addedParents);
          }
          if(se.move.removedParents) {
            for(var k = 0; k < se.move.removedParents.length; k++) {
              Logger.log(se.move.removedParents[k].id);
              Logger.log(se.move.removedParents[k].isRoot);
              Logger.log(se.move.removedParents[k].title);
            }
          } else {
            Logger.log(se.move.removedParents);
          }
        } else {
          Logger.log(se.move);
        }
        Logger.log(se.permissionChanges);
        Logger.log(se.primaryEventType);
        if(se.rename) {
          Logger.log(se.rename.newTitle);
          Logger.log(se.rename.oldTitle);
        } else {
          Logger.log(se.rename);
        }
        Logger.log(se.target.id);
        Logger.log(se.target.mimeType);
        Logger.log(se.target.name);
        Logger.log(se.user.name);
        Logger.log(se.user.photo.url);
      }
    }
    pageToken = result.nextPageToken;
  } while (pageToken);
}
```

# 何が取れたのか？
結局、取れたのはGoogle Driveの変更履歴（singleEvents）と、その履歴を一つにまとめたもの（combinedEvent）が取れました。

試しに発表資料の履歴を取得してみると大量の履歴が取得できてしまったので、ざっと見ていると、ファイル名を変更したり、フォルダの下に移動した履歴（move）はもちろんのこと、ファイルの編集の履歴（edit）も残っていました。ただ、「中身をどのように編集をしたか」は取得できないようなので、中身の編集についてはわかりません。変更を検知したタイミングで様子を見て下さい。ただ、相当のログが残るようなので、編集のタイミングで見てたらきりがないかも…。

# 結局
変更の内容を監視しなければいけないような人が管理用に使うにはいいかもしれないですが、そんなに使うかな…？

## Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）