9
12

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 5 years have passed since last update.

GASでGoogleドキュメントを自動作成してslackに通知する仕組み

Posted at

私の所属しているチームでは、毎朝各自がやることをGoogleドキュメントに記載して共有しています。
2月頃にドキュメント作成&Slackへの通知を自動化したので、隙間時間に投稿します。

なお、以下参考にしたページです。

要件

  • 営業日の9時前に当日の日付を名前にもつGoogleドキュメントを作成してSlackにポストする
  • 新規ドキュメントの内容は、前営業日のものをコピーしたものとする(ゼロから書くのは手間なので)

作業手順

結構前のことなので、内容漏れてるかもしれません。もし動かなかったらすみません…。

  • GoogleDriveにいく
  • ドキュメント保存先のフォルダにアクセスする
  • URLからフォルダIDを取得する
    • https://drive.google.com/drive/u/0/folders/XXXのXXX部分
  • Slackの管理画面にいく
  • 通知したいチャンネル用のincoming webhook urlを取得する
  • Googleカレンダーにいく
  • 設定 -> カレンダーを追加 -> 関心のあるカレンダーをさがすから 日本の祝日 にチェックをする
    • 祝日判定時にこのカレンダーを見に来る。
  • GASダッシュボードにいく
  • 新規スクリプトを作成する(適当に名前をつける)
  • コードを書く
  • 編集 -> すべてのトリガー -> 新しいトリガーを追加から実行スケジュールを登録する
    • 実行したい関数を選択後、時間主導型、日タイマー、午前8〜9時とした
    • GASのトリガーはcronみたいに厳格なものじゃなくて「8〜9時のどこかで実行するね」みたいなアバウトなものなので要注意。

コード

var postUrl = '<Slackのincoming webhook url>';
var username = '<Slack通知者名>';
var icon = ':page_facing_up:';  // 通知時に表示されるアイコン
var targetFolderId = '<作成したドキュメントを配置するフォルダのID>'

/**
* copy docs
*/
function createCopy() {
  //ファイル名のベースとなる文字列
  var fileName = 'my_team';
  
  //コピー元となるドキュメントファイルのIDを取得
  var fileId = ''
  var files = DriveApp.getFolderById(targetFolderId).getFiles();
  // 一番最初のファイルが前日作成したファイルとなる
  if(files.hasNext()){
    var file = files.next();
    fileId = file.getId()
  }
  
  
  //ファイル名の日付部分作成
  var date = new Date();
  var formattedDate = Utilities.formatDate(date, "JST", "yyyyMMdd");
  
  //コピー元のファイルを開く
  var file = DriveApp.getFileById(fileId);
  //コピーを作成。作成したコピーを参照。
  var newFile = file.makeCopy(fileName + "-" + formattedDate);
  
  return newFile;
}

/**
* post message to slack
*/
function postMessage(message) {
  var jsonData =
      {
        "username" : username,
        "icon_emoji": icon,
        "text" : message
      };
  var payload = JSON.stringify(jsonData);
  
  var options =
      {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };
  
  UrlFetchApp.fetch(postUrl, options);
}

/**
* create docs bot
*/
function createDocBot()
{
  // 日付取得 祝日は実行しない
  var currentDate = new Date();
  var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
    return;
  }

  // 土曜日、日曜日は実行しない
  var weekday = currentDate.getDay();
  if (weekday == 0 || weekday == 6) {
    return;
  }
  
  // ドキュメントをコピーして作成
  var objDoc = createCopy();
  
  // ドキュメントをフォルダ配下に移動させる
  var docFile = DriveApp.getFileById(objDoc.getId());
  var targetFolder = DriveApp.getFolderById(targetFolderId);
  targetFolder.addFile(docFile);
  DriveApp.getRootFolder().removeFile(docFile);
  
  // slackへurlをpost
  var url = docFile.getUrl();
  var message  = "朝共有メモ: " + url
  postMessage(message)
}
9
12
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
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?