LoginSignup
1
1

More than 3 years have passed since last update.

SpreadsheetにGASを導入しレポートを楽々に

Last updated at Posted at 2020-05-21

ウェブディレクターとしてはあるあるの話なんですが、解析ツール上のデータを何かしらんのレポートを作って上司への報告や関係各所への共有は日常茶飯事のように求められます。
心のなかでは、自分で見ればいいのにと叫びたいところですが、そうもいかず、きちんと報告・共有することこそが社会人としての見せ所です。
しかし、地味なコピペ作業こそ、人生の無駄かと思います。
そこで、なにかと自動化にできれば万々歳です。
GAの場合、APIとかを活用してSpreadsheetへの連携はなんとか実現できるものの、しかし、問題児のAdobe Analyticsはなかなかしんどいです。
一応、重要な情報としては扱いであり、サードパーティのツールを使うのにヒヤヒヤします。
それでもやらねばと思い、下記手順を考えました。

  1. Adobe Analyticsのレポートビルダーで必要なレポートを作成
  2. そのレポートを毎日Gsuiteのメールに配信する
  3. GASで配信されたファイルをハイジャックする
  4. ハイジャックしたエクセルファイルを既存のスプレッドシートへデータを移す

少々手間がかかりますが、これで人生に余分な時間を節約できると考えるとなにかとうれしいです。
下記、ソースコードを紹介します。

report.js
function getReport(){

  // 各定義
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  var thisDate = Utilities.formatDate(yesterday,"JST","yyyy/M/d");
  var Folder_ID = 'xxxxxxxxxxxxxx'; //保存するフォルダ
  var Search_Term = 'subject:(xxxxxxxxx.xlsx) after:' + thisDate; //該当条件のスレッドを検索、ファイル名を入力
  var myFolder = DriveApp.getFolderById(Folder_ID); //フォルダを取得
  var myThreads = GmailApp.search(Search_Term, 0, 30); //条件にマッチしたスレッドを検索して取得
  var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納

  // メールから最新版のXLSファイルを取得・保存
  for(var i in myMessages){
    for(var j in myMessages[i]){
      var attachments = myMessages[i][j].getAttachments(); //添付ファイルを取得
        myFolder.createFile(attachments[3]); //ドライブに添付ファイルを保存
    }
  }

  // 取得したXLSファイルをスプレッドシートへ変換
  var targetXLS = myFolder.getFilesByName('xxxxxxxxx.xlsx').next(); //臨時XLSファイルを定義
  var xlsID = targetXLS.getId(); //臨時XLSのID取得
  var filename = "xxxxxxxx";  //書き出すスプレッドシートファイル名を定義
  var res = Drive.Files.insert({
    "mimeType": "application/vnd.google-apps.spreadsheet",
    "parents": [{id: Folder_ID}],
    "title": filename
  }, DriveApp.getFileById(xlsID).getBlob()); //XLSからスプレッドシートへ変換
  myFolder.removeFile(targetXLS); //臨時XLSファイルを削除

  // 抽出用ファイルとその各シートを定義
  var thisFile = SpreadsheetApp.openById('xxxxxxxxxxxx'); //フォルダ名を入力
  var thisDaily = thisFile.getSheetByName("daily");
  var thisWeekly = thisFile.getSheetByName("weekly");
  var thisMonthly = thisFile.getSheetByName("monthly");

  // 更新されるファイルとその各シートを定義
  // 一応日次、週次、月次のシートがあるとして
  var newFile = myFolder.getFilesByName('xxxxxxxxx').next(); //ファイル名を指定
  var targetID = newFile.getId();
  var targetFile = SpreadsheetApp.openById(targetID);
  var targetDaily = targetFile.getSheetByName("daily");
  var targetWeekly = targetFile.getSheetByName("weekly");
  var targetMonthly = targetFile.getSheetByName("monthly");

  // ループで各数値を上書き
  // データの範囲を各々に合わせて修正していただくように
  for (var x=3; x<=8; x++) {
    for (var y=4; y<=10; y++) {
      thisDaily.getRange(y, x).setValue(targetDaily.getRange(y, x).getValue());
    }
  }
  for (var x=3; x<=8; x++) {
    for (var y=4; y<=7; y++) {
      thisWeekly.getRange(y, x).setValue(targetWeekly.getRange(y, x).getValue());
    }
  }
  for (var x=3; x<=8; x++) {
    for (var y=4; y<=16; y++) {
      thisMonthly.getRange(y, x).setValue(targetMonthly.getRange(y, x).getValue());
    }
  }
  //臨時スプレッドシートを削除
  var oldFile = myFolder.getFilesByName('xxxxxxx').next(); //旧ファイル名からファイルを検索
  myFolder.removeFile(oldFile); //旧ファイルを削除
}


1
1
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
1
1