Help us understand the problem. What is going on with this article?

GAS入門編 - Google Apps Script

More than 1 year has passed since last update.

GAS とは

✳︎ 間に合いませんでした!
Google Apps Script ドキュメント
Google が提供しているサーバーサイドのスクリプト環境です。
具体的に何ができるかといいますと

  • Google カレンダー、Excel、Word、Gmail などなどを操作可能
  • フロントのみでほぼ完結可能(GAS が記述できればそれ自体がサーバとなり得る)
  • 応答はやや遅めなため過度な期待は禁物
  • Drive などは鯖を経由しなければならないなどフロントだけでは何とかならない部分もある

GAS のセットアップ

  1. Google Drive へアクセス
  2. Script のファイル作成
  • 右クリック
  • その他を選択
  • GoogleAppScript を選択
  • 無い場合は一番下のその他から Google Apps Script を検索し、接続を行う
  1. ゴリゴリ記述していく スクリーンショット 2018-12-12 17.28.33.png

今回のサンプルコード

HAL の単元管理アプリを作成していきたいと思います。
個人的に Google 系のアプリケーションを使用する事が多いのでこれらを
とりあえず定数を作成していきます。(validation は面倒なので省きます)

// サンプルデータ ?date=2018/12/12&unit=1&subject=SD25&room=121&comment=要件定義書の締め切り
// 単元の時間一覧
var UNIT_LIST = {
  1: { start: "09:00:00", end: "10:30:00" },
  2: { start: "10:45:00", end: "12:15:00" },
  3: { start: "13:05:00", end: "14:35:00" },
  4: { start: "14:50:00", end: "16:20:00" },
  5: { start: "16:30:00", end: "18:30:00" }
};
// HAL大阪の所在地
var HAL_LOCATION = "〒530-0001 大阪府大阪市北区梅田3丁目3−1";
/**
 * 今回はdoGetを通して行なっているが本来はdoPostのほうが好ましい
 * @param {string} event.parameter.method 実行するメソッドを指定する
 */
function doGet(e) {
  if (e == null) return responseToJSON({state:"error"});
  const p = e.parameter;
  const payload = createSubject(p);
  return responseToJSON(payload);
}
/**
 * responseToJSON
 * GAS用の返却値を生成する
 * @param {object} json
 */
function responseToJSON(json){
  ContentService.createTextOutput();
  const output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  return output.setContent(JSON.stringify(json));
}
/**
 * createSubject
 * @param {object} p ParameterObject
 * @param {string} p.room 教室の情報 (192)
 * @param {string} p.date 日付 (YYYY/MM/DD)
 * @param {string} p.unit 単元 (1-5)
 * @param {string} p.subject 単元名 (DB25)
 * @param {string} p.comment その他コメント
 * @param {string} p.location 授業の行われる住所 (デフォルトでHALの現在地が入る)
 */
function createSubject(p) {
  const option = createOption(p.room, p.comment, p.location);
  const calendar = CalendarApp.getDefaultCalendar();
  const startDateTime = new Date(p.date + " " + UNIT_LIST[p.unit].start);
  const endDateTime = new Date(p.date + " " + UNIT_LIST[p.unit].end);
  calendar.createEvent(p.subject, startDateTime, endDateTime, option);
  return {
    state:"ok",
    subject: p.subject,
    start: startDateTime,
    end: endDateTime,
    description: option.description
  };
}
/**
 * createOption
 * @param {string} room 教室の情報 (192)
 * @param {string} comment 注釈程度のコメント
 * @param {string} location 授業の行われる住所 (デフォルトでHALの現在地が入る)
 */
function createOption(room, comment, location) {
  description = "教室:" + room + "\n" + comment;
  location = location || HAL_LOCATION;
  return { description: description, location: location };
}

公開手順

  1. ナビゲーションのヘルプの隣にある公開をクリック
  2. ウェブアプリケーションとして導入をクリック
  3. 各種設定項目を設定し導入をクリック
    • プロジェクトバージョン
      • 新規作成
      • 1 とかにしておく
    • 次のユーザのアプリケーションとして実行
      • 自分
        • 共有カレンダーなどを作成した場合はこちらのほうが好ましい
      • ウェブアプリケーションにアクセスしているユーザ
        • 文字通り、実行した本人の Google アカウントへ実施
    • アプリケーションにアクセスできるユーザー
      • お好みですが今回は自分だけで良いきがします。
  4. URL が取得できるのでメモを控えておきましょう
  5. {取得したURL}?date=2018/12/12&unit=1&subject=SD25&room=121&comment=要件定義書の締め切りを実行
  6. 諸々許可し返却値を確認する
  7. 右記のような形式なら成功{"state":"ok","subject":"SD25","start":"2018-12-12T00:00:00.000Z","end":"2018-12-12T01:30:00.000Z","description":"教室:121\n要件定義書の締め切り"}

これで Google Apps Script が一通り動く形になりました。
フロントのみで OAuth 認証 を行えたら非同期通信として 値を送信できるアプリケーションも作れるような気がするので、何かと便利
Excel はもちろん、Google アナリティクスや Drive にも接続できそうなので、Google アナリティクスの結果を Excel にまとめる会社をちらほら聞きますので、こういう部分で自動化を行えたりすれば無駄な時間を過ごさずに済んだり、ちょっとプログラムを書けば面倒な定期的な予定管理も楽に実装できそうな気がします。
他にもあまり推奨はされないですけれど、簡易 DB として GoogleExcel を使用したりなどできますので、夢が広がりそうですね。

おすすめリンク

これより下は未整備

OAuth のセットアップ (必要ないかも)

  1. GAS へアクセス
  2. プルダウンメニューをプロジェクトを作成に合わせたまま続行 結構アクセス長いです
  3. 認証情報に進む
  4. 下記を設定し、必要な認証情報をクリック
    • 使用する API :  App Script API
    • API を呼び出す場所 : ウェブブラウザ(JavaScript)
  5. 下記を設定し、OAuth クライアント ID を作成をクリック
    • 名前 : 任意で適当につけよう
    • 制限事項
    • 今回は Oatuh を使用しないので、問題はないが必要なら設定を行う
  6. 下記を設定し次へをクリック
    • メールアドレス
    • 任意のアドレス
    • ユーザーに表示するサービス名
    • 任意のサービス名
  7. ダウンロードをクリックし、完了をクリック
    • クライアント ID などは全部こちらに搬入されているので問題ない

ダウンロードした JSON ファイルは後々使用するので補完しておきます。

各種オブジェクトの取得方法(カレンダー編)

CalendarApp.getDefaultCalendar()
CalenderApp.getCalendarById("ID")
CalenderApp.getCalendarsByName("カレンダー名");
CalendarApp.getOwnedCalendarsByName("カレンダー名");

CalenderApp 命令一覧

createCalender 命令

概要:カレンダーを新たに作成をするスクリプト

// カレンダー名だけを指定して、カレンダーを生成する。
CalendarApp.createCalender("カレンダー名");
// その他詳細な設定を使用して生成する。
CalenderApp.createCalender("カレンダー名", {
  // 住所情報
  location: "場所の情報",
  // カレンダーの概要
  summary: "カレンダーの概要",
  // タイムゾーン
  timeZone: "Asia/Tokyo",
  // カレンダーのラベルカラー
  color: CalendarApp.Color.ORANGE,
  // true: 非公開, false: 公開
  hidden: true,
  // true: カレンダーの予定を表示する false: カレンダーの予定を表示しない
  selected: false
});

CalenderObject 命令一覧

getName 命令

カレンダーの名前を取得する命令

createEvent 命令

引数(title :string, start :time, end :time, )

参考記事一覧

Google Apps Script 入門
Google Sheets API を使って限定公開のシートを Javascript で操作する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away