Google App Scriptを使っていい感じに予定の作成&取得をする

この記事はチームスピリット Advent Calendar 2020の記事です。

背景

メリークリスマス!皆さんは、Gカレンダーの予定を一覧で取得・作成したいと思っことはありませんか?

私は資格試験取得するために学習計画を立てていた時に予定を一覧で取得作成したいと思いました。

調べたところ、Google App Scriptを使えば、面倒な認証のコード等を書かずに簡単に予定を出力・作成できることができることがわかりました。

作成のお手本はこちらです。
www.whizz-tech.co.jp
取得のお手本はこちらです。
developers.google.com
拙作ながら、作成したコードのリンクも記載しておきます。
github.com

計画(予定作成)編

予定作成用シートの作成

上記の作成のお手本を元に予定作成用のシートのフォーマットを作成します。

f:id:a_nakaya:20201215075812p:plain
Create Plan Sheet

ちなみに今回入力する予定は、Salesforceのアプリケーションビルダー資格の学習計画です。
Trailheadと無償ウェビナーの予定を入力しました。
www.salesforce.com
trailhead.salesforce.com

アカウントの連携

アカウントの連携はほぼ不要です。
↓の感じでCalendarAppのデフォルトカレンダーを取得をすると、自分のカレンダーを取得してくれます。

const gAccount = CalendarApp.getDefaultCalendar().getId(); //デフォルトのカレンダーを取得

スプレッドシートから入力した情報を取り込む

ここはあまりお手本にしない方がいいかもですが、シートの入力した行までを取得します。
ヘッダ名でで列を指定する方法に修正したいなと思っています。今回は簡単に列を番号指定しました。

// 読み取り範囲(表の始まり行と終わり列)
  const topRow = 5;
  const lastCol = 12;

  // 0始まりで列を指定しておく
  const statusCellNum = 4;

  // シートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Plan");
  Logger.log("===sheet:"+sheet);

// 予定の最終行を取得
  var lastRow = sheet.getLastRow();
  
  //予定の一覧を取得
  var contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();

  //順に予定を作成(今回は正しい値が来ることを想定)
  for (i = 0; i <= lastRow - topRow; i++) {

    var status = contents[i][statusCellNum];
  }

現在のシートは、SpreadsheetAppから取得できます。
私はシートは「Plan」シート固定で取得しました。
developers.google.com

予定の作成

さて、いよいよ予定の作成実処理です。
予定の作成にはCalendarApp.createEventを利用し、↓の感じで記載しました。

        // 予定を作成
        calender.createEvent(
          title,
          startDate,
          endDate,
          options
        );

options項目には前段で説明を追加しています。

// 詳細をセット
    var options = {description: contents[i][descriptionCellNum]};

予定取り込みボタンの作成

今回はスプレッドシートにプルダウンメニューを追加して、予定取り込みを実行できる様にしました。
↓の感じで定義すると、

/**
 * スプレッドシート表示の際に呼出し
 */
function onOpen() {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //スプレッドシートのメニューにカスタムメニュー「計画取込 > 実行」を作成
  var subMenus = [];
  subMenus.push({
    name: "Migrate Plan| 計画取込",
    functionName: "createSchedule"  //実行で呼び出す関数を指定
  });
  subMenus.push({
    name: "実行",
    functionName: "exportSchedule"  //実行で呼び出す関数を指定
  });
  ss.addMenu("計画取込", subMenus);
}

こんな感じに表示してくれます。

f:id:a_nakaya:20201215082917p:plain
サブメニュー | Sub Menu

実行

あとはスクリプトのアクセスを許可して実行します。
無事成功しました!

f:id:a_nakaya:20201215083122p:plain
作成結果 | Result

気付き

やっぱり、列指定の部分が複雑になっているので改善したいなと思いました。
またダイアログを出す方法↓を知らなかったので、勉強になりました。

Browser.msgBox("完了");

評価(予定取得)編

スプレッドシートの作成

今度は取得用のスプレッドシートを作成して行きます。

f:id:a_nakaya:20201215083548p:plain
Check Schedule

今回は↓の様に自分のカレンダーではなく、Salesforce用にカレンダーを紐付け、そのカレンダーに登録されている期間の予定を取得します。
(取り込んだ予定は全てSalesforceのマイカレンダに変更しました。。。予定の作成時にカレンダーを登録できる様にしたいものです)

f:id:a_nakaya:20201215083803p:plain
Schedule

予定の取得

シートから設定を取り込む方法は割愛して、予定の取得の説明に入りたいと思います。
今回予定はCalendarApp.getCalendarByNameを利用して取得しました。

function getSalesforceCalendars() {
  var calendars = CalendarApp.getCalendarsByName('Salesforce');
  Logger.log('Found %s matching calendars.', calendars.length);
  return calendars[0];// とりあえず1行のみ返す
}

↓の様に取得ロジックを書くと全てのカレンダを取得して、あとはIDまたは名前指定で予定を取得することもできます。

function init() {
  var calendars = getAllCalendars();
  calendars.forEach(function(calendar) {
    getEvents(calendar)
  });
}
function getEvents(calendar) {
  var events = calendar.getEvents(startDate, endDate);
}
function getAllCalendars() {
  var calendars = CalendarApp.getAllCalendars();
  Logger.log('Found %s matching calendars.', calendars.length);
  return calendars;// とりあえず1行のみ返す
}

実行

プルダウンメニューを編集して予定の出力もできる様にします。

/**
 * スプレッドシート表示の際に呼出し
 */
function onOpen() {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //スプレッドシートのメニューにカスタムメニュー「計画取込 > 実行」を作成
  var subMenus = [];
  subMenus.push({
    name: "Migrate Plan| 計画取込",
    functionName: "createSchedule"  //実行で呼び出す関数を指定
  });
  subMenus.push({
    name: "Export Sche.| 予定取得",
    functionName: "exportSchedule"  //実行で呼び出す関数を指定
  });
  ss.addMenu("Plan & Schedule| 計画と予定", subMenus);
}

無事作成できました!

f:id:a_nakaya:20201215084725p:plain
取得結果 | Select Result

気付き

今は自分の予定だけですが、チームメンバーの予定を取得したり、個人の作業時間なのか?MTGなのか?などを取得できる様になれたら良いなと思いました。

まとめ

予定の取得や作成がエクセルベースでできる様になるとタスクの登録などが便利になるなと思います。
参考になれば、幸いです。

カルトナージュの手法でいい感じのノートPCスタンドを作る 2019

f:id:a_nakaya:20191217223618j:plain

Note stand 1st ver.

この記事は チームスピリット Advent Calendar 2019 の17日目の記事です。

2019年の内容について

Merry Chrismas! a_nakayaです。
今年もAdvent Calendarの季節がやってきました。
去年お仕事の話を書いたので、今年は趣味の話を書こうと思います。職場・自宅で利用する用にノートスタンド を作成したのでその話をしようと思います。

きっかけ

ノートスタンドを作成しようと思ったきっかけはこちらです。

  • 元デスクトップPCユーザからするとキーボードに角度が欲しい
  • 職場がフリーアドレスになり、充電器などの小物も持ち運ぶ必要ができた
  • 欲しいと思ったノートPCスタンドを見つけたが、思いの外高かった(229€て...orz)

    http://vool.me/

ニーズと機能について

今回のニーズを整理すると以下が満たされていると良さそうです。

  • ニーズ:打鍵しやすいものが欲しい
    機能:キーボード面に角度がついていてかつ打鍵時にぐらつかない
  • ニーズ:他のものも持ち運びたい
    機能:充電器や小物なども収納できるスペースがある
       持ち運び時にバラバラになることがない
  • ニーズ:シンプルかつお洒落なものが欲しい
    機能:みためがシンプルかつお洒落

0. 閃く

上記の機能を持つようなノートPCスタンドを探し、何日もネットサーフィンしましたが、いい感じのノートスタンドはありませんでした。(もしくは売り切れ...)
ある朝、「司書時代の修補の知識とカルトナージュの手法を使えば、ノートPCスタンドを作れるのでは?」という発想を思いつきました。

f:id:a_nakaya:20191218005151j:plain

Morning Page 2019/8/4

1. 機能と発想を元に設計する

f:id:a_nakaya:20191217230843j:plain

Morning Page 2019/9/15

上記の機能を満たすように図面を書きます。ネットサーフィンでの調査の結果、外付けでキーボードを接続しない場合、キーボード面の角度は10度にするのが良さそうです。またノートPCと収納する小物が入る大きさになるように収納後のスペースも考える必要がありました。
この段階では、Book型Boxをベースにして設計してました。

2. 調達する

道具は家にあるものを使うとして、厚紙や包み紙などの材料はBox&Needleさんに、水張りテープなどの小物と包み紙の一部は伊東屋さんに買いに行きました。

www.ito-ya.co.jp

boxandneedle.com

実際に使った道具と材料はこちらです。

f:id:a_nakaya:20191217234621j:plain

Tools
材料
  • ボンド(製本用であれば尚良し)
  • でんぷん糊
  • 水張りテープ
  • 両面テープ
  • 合紙の厚紙
  • 包み紙(外側用のコーティングされたもの・アクセントになるようなもの2枚)
  • 金具(オープナー型のみ)
  • Macの空き箱
道具
  • バット(糊を混ぜる用)
  • 刷毛(糊を混ぜる用)
  • 水書筆ぺん(水張りテープ貼る用)
  • カッター
  • カッティングマット
  • 包帯
  • 本など重しになりそうなもの
  • オーブンペーパー
  • 目打ち

3.(余談)和紙について

アクセントになるような包み紙は和紙を採用しています。
実は資料保存・修補の世界では、世界的に和紙が修復材として利用されています。
私見ですが、厚紙に貼り付ける時にしわができにくい気がします。

www.washiarts.com

www.hozon.co.jp

4. Book型BoxをベースにしたノートPCスタンドを作ってみる

f:id:a_nakaya:20191218003107j:plain

Note stand 0th ver.

f:id:a_nakaya:20191218012059j:plain

というわけで作ってみたのが上記のものです。作ってみた結果、以下のことがわかりました。

  • キーボードの前面に厚紙があると、ちょっと痛い
  • 上箱が大きすぎて画面の角度を変更しにくい
  • とにかくデカい

上記の問題を解決するために、金具で開くオープナー型のBoxをベースにして再度設計を行うことにしました。

5. オープナー型のBoxをベースにしたノートPCスタンドを作ってみる

f:id:a_nakaya:20191218001207j:plain

f:id:a_nakaya:20191218012010j:plain

次はいい感じのものができました✨
手順はこんな感じです。

  1. Macの空き箱を分解する
  2. コードが入っていた部分と前面の部分をカットする
  3. 上箱用・下箱用・下箱の内側補強用として厚紙を切る
  4. 厚紙のおる部分は折山が紙一枚で繋がるように折れ線をカッターでいれる
  5. 下箱の裏紙・上箱の表面の包み紙を切る
  6. 上箱を水張りテープで貼り付けて箱型にする
  7. 水・デンプン糊・ボンドを混ぜて、裏紙・包み紙を貼り付ける用ののりを作る
  8. 裏紙の裏面に中央から外側へ7で作ったのりを塗る
  9. 下箱の厚紙に貼る
  10. オーブンペーパーを間に敷いて、重しを載せる(そのまま1日放置)
  11. 上箱の包み紙の裏面に中央から外側へ7で作ったのりを塗る
  12. 上箱の厚紙に貼る(側面はひっぱりながら貼る)
  13. オーブンペーパーを間に敷いて、重しを載せる(そのまま2日放置)
  14. 下箱を水張りテープで貼り付けて箱型にする
  15. Macの空き箱の側面に両面テープを貼り付ける
  16. 内側補強用の厚紙を内側から貼り付ける
  17. 下箱に穴を空ける(金具を取り付ける用)
  18. 上箱に穴を空ける(金具を取り付ける用)
  19. 上箱・下箱にドライバーで金具を取り付ける
  20. 下箱にMacの空き箱を貼り付ける
  21. 完成! 

設計図は見つけることができなかったです😭すみません。

6. 実際に使ってみて

Book型ノートPCスタンドの方は家で、オープナー型ノートPCスタンドの方は会社で3ヶ月ほど使っています。特に問題が発生することもなく、快適です✨

7. 参考図書&おすすめ図書

 

Develop with Salesforce? 〜Salesforce初心者向けまとめ〜

f:id:a_nakaya:20181207084744j:plain

Title ’Develop with salesforce?’

0. 2018年について

メリークリスマス!nakaya_aです。
今年も24日で終わるなんて信じられませんね。今年8月に転職して、初めてSalesforceプラットフォーム上で開発を行うことになりました。
全くSalesforce開発を知らない人のために、4カ月で得られた私なりのSalesforce開発とは?について書こうと思います。

1. Salesforceって何?

 転職するまでのSalesforceのイメージは、営業管理や顧客管理、営業支援アプリケーションのベンダーというイメージでした。
Salesforceは上記だけではなく、全てのSalesforce環境で動くプラットフォームも提供しています。

www.salesforce.com

そのプラットフォーム上で動くアプリケーションはAppExchangeから検索・ダウンロードできます。学習はこちらからどうぞ。

2. 学習ツールがある!!!

Trailhead という「管理者、ユーザー、開発者が楽しく簡単に Salesforce のスキルを身に着けることができる無料の学習ツール」があります。
またTrailhead Playgroundという「学習中のスキルを実際の作業に使用する前に練習できる安全な環境」があり、実践で学ぶことができます。

また学習した単元でBadgeを集めるのが楽しいです!喫緊の目標は、Badgeを100個集めたいなと思ってます。。

学習内容は、「どうやって〇〇機能の開発をするの?」という開発向けのものから、「どうやって環境や機能を管理する?」など管理者向けのもの、コンサルタント向けのものがあります。
自分が成長したい方向に合わせて、必要なトレイルを選んでいくと良いですね。

f:id:a_nakaya:20181207092159p:plain

Trailhead Profile


3. 何を目指す?

経験的トレーニングの積み上げも大事ですが、できればスキルを資格にしたいところです。。
認定資格が用意されています。

基本資格でいくつか気になっているものがあるので、来年は資格取得も頑張りたいです。

(入社前にSalesforceの経験(スキル)と年収のマップを見たのですが、発見できず。。発見したらリンク貼っておきます。。)

f:id:a_nakaya:20181207094136p:plain

Developer Certification Map

4. やってみよう!

ノーコード・ローコードで開発できるのも、Salesforceのメリットの1つです。

以下は、Salesforceのアプリケーションの構成例です。

単一のオブジェクトを作成・追加するページを作りたいだけであれば、Codeを書かなくても、設定画面からオブジェクト更新用のページを作成することができます。

f:id:a_nakaya:20181208040919p:plain

Example of Salesforce Apps

またパッケージ開発では、メタデータを作成し標準ページレイアウトやオブジェクトの項目追加を行うことができます。

おすすめのTrailheadは以下です。

trailhead.salesforce.com

f:id:a_nakaya:20181208042812p:plain

https://trailhead.salesforce.com/ja/users/00550000006ywODAAY/trailmixes/first

5. パッケージ環境構築

実際に開発環境を作ってみたいと思います。Apex拡張機能Eclipseにもありますが、

今回はSalesforce DXを使って環境構築を行おうと思います。
以下のPageを参考に環境構築を行いました。

www.techscore.com

Salesforce DXでは、5で作った環境で設定を変更し、コマンドでローカルにPullする機能があります。
Salesforce DXを使う前提として、PCにjavaをインストールしておく必要があります。
またソース管理を行いたい場合は、Gitのインストール・vscodeへのセットアップが必要です。

6. ページを作ってみる

早速、5で作った環境Visualforceページを作成してみましょう!

  1.  コマンドパレットを開く(vscode上でcommand+shift+p)
  2. 出てきた入力枠に’SFDX: open Default Org’と入力
  3. 開発コンソールを開く
  4. file>New>Visualfore Pageを押下
  5. Page Nameに’TaskPortal’を入力
  6. 開いているTaskPortal.vfpに以下をペースト

    <apex:page >
    <h1>Task Portal</h1>
    </apex:page>

  7. 保存を押下
  8. コマンドパレットを開く(vscode上でcommand+shift+p)
  9. 出てきた入力枠に'SFDX: Push Source to Default Scratch Org'と入力
  10. force-appのフォルダ配下にTaskPortal.vfpができたら成功です!

f:id:a_nakaya:20181208054514p:plain

7. 終わりに

サーバーレスなのでセットアップさえ間違えなければ、簡単に環境構築・アプリケーション開発を行えるのが魅力だなーと思いました。

一方で、Java Likeな独自言語「Apex」やガバナ制限などプラットフォームの制約を覚える必要があるので、Codeを書くアプリケーション構成を選んだ場合、キャッチアップコストがある程度かかることを考慮した方が良いです。

簡単ではありますが、ざっくり私なりのSalesforce開発にまとめてみました!また何かのアプリケーションを作成したら、Blog書きます!
このブログはチームスピリット Advent Calendar 7日目のBlogです。
他のブログは以下からどうぞ。。HUNTER×HUNTER読者の私は、4日目が面白かったです。

adventar.org