どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年9月から始まりました「ノンプロ研GAS中級講座6期」について、全7回でお届けします。今日はDay5です。
前回のおさらい
前回は、「Utilitiy services1」 をお届けしました。
今回は、 「Utilitiy services2」 をお届けします。
今日のアジェンダ
- セッションとユーザー
- Blobクラス
- Utilitiesサービス
セッションとユーザー
Baseサービスのおさらい
今回は、引き続き、Utilitiy servicesです。
Script execution & informationで提供されている、Baseサービスで提供されているクラスを紹介します。
SessionやBlobといったクラスが紹介されるたびに、リファレンスでいうとどこに書かれているのか確認すると、記憶の整理にもつながりますのでオススメします。(講座内ではリファレンスまで確認する時間がありません。ご了承ください。)
セッションクラスとユーザークラス
Sessionクラスは、主に、スクリプトにアクセスしているユーザーオブジェクトを取得することが目的です。
//アクティブなUserオブジェクトを変数に格納する
const userObject = Session.getActiveUser();
トリガーの設置アカウントと実行アカウント
前回学んだ、トリガーですが、設置アカウントと実行アカウントの違いを体験してみましょう。
まず、スクリプトファイルに共有権限を設定することを忘れないようにしてください。
そして、ブラウザをもう一つ準備することをオススメします。(ひとつのブラウザでアカウントを切り替えるのはめんどくさいです)
共有設定が終わったら、関数myFunction()を実行して、3分後にgetActiveUser()のEmailログ出力するトリガーを設置します。
function myFunction() {
const setTime = new Date();
setTime.setMinutes(setTime.getMinutes() + 3);
ScriptApp.newTrigger("getActiveUserLog_").timeBased().at(setTime).create();
}
function getActiveUserLog_() {
console.log(Session.getActiveUser().getEmail());
}
トリガーを確認すると、オーナーは自分になっています。
実行数を確認すると、トリガーを設置したアカウントのメールアドレスがログ出力されています。
それでは、もう一度、関数myFunction()を実行して、トリガーを設置しましょう。
トリガーを設置したら、別のアカウントで開いているブラウザから、トリガーを確認しましょう。
オーナーには、「他のユーザー」が表示されています。
実行数を確認すると、getActiveUser()のEmailがログ出力されています。
いまアクティブなのは、トリガーを設置したアカウントではないので、別のアカウントのメールアドレスがログ出力されてほしいですが、実際は、トリガーを設置したアカウントのメールアドレスがログ出力されています。
これが、GASのトリガーの実行アカウントと設置アカウントの仕様です。
getActiveUser()と言われると、つい、いまGASを開いているアカウントを指すようですが、トリガーで発火させるときは、注意が必要です。
フォーム送信時などに、ぶつかる壁だと思います。その回避のテクニックをブログにしましたので、ご参考までに。
Blobクラス
Blobオブジェクトリテラル
JavaScriptには、Blobオブジェクトを生成するコンストラクタが用意されています。
const obj = {hello: 'world'};
const blob = new Blob([JSON.stringify(obj, null, 2)], {type : 'application/json'});
console.log(blob); //{size: 22, type: "application/json"}
ブラウザのデベロッパーツールなどで、実行してみましょう。
残念ながらGASには、Blobオブジェクトリテラルが用意されていません。
なので、UtilitiesクラスにBlobオブジェクトを生成する newBlob()メソッド が用意されています。
Utilities.newBlob(data)
講座では、BlobSourceインターフェイス(クラス)の、getAs(MimeType.PNG)メソッドでBlobを取得しました。
しかし、fileクラスには、getBlob()メソッドがありますし、BlobクラスにもgetAs(MimeType.PNG)メソッドがありますので、このように記述できます。
const id = 'ファイルID';
const file = DriveApp.getFileById(id);
const blob = file.getBlob().getAs(MimeType.PNG);
インターフェイスとは、クラスです。しかし、インターフェイスではインスタンスを生成せずに、継承することを目的としたクラスです。
継承については、また別途ブロブを書きますね。
BlobSourceインターフェースは クラス で、メンバーが2種類あるということを覚えましょう。
BlobSourceオブジェクト.getBlob()
BlobSourceオブジェクト.getAs(contentType)
ドキュメント・スプレッドシートの変換
指定したファイルをBlobとして取得したら、つぎは、csvや画像として変換したいかもしれません。
しかしながら、SpreadsheetオブジェクトやDocumentオブジェクトなどの、GWSのオブジェクトは、取得した時点でコンテンツタイプが「application/pdf」になります。
これは仕様です。
もし将来的に、PDFを画像やテキストに変換できると、需要が高そうですね。
const file = DriveApp.getFileById('GoogleドキュメントのID');
const blob = file.getBlob();
console.log(blob.getContentType()); //application/pdf
Enum
getAs()メソッドに渡す引数はcontentTypeです。contenntTypeの正式名称は Enum MineType です。
よく聞くEnumですが、簡単な解説をブログにしたことがあるので、こちらをご参照ください。
補講ブログ的には、MimeType.JPEGプロパティにはimage/jpeg、MimeType.PDFプロパティにはapplication/pdfが定義されているため、引数はどちらでも構わないという点が大事です。
BlobSourceオブジェクト.getAs(MimeType.JPEG)
BlobSourceオブジェクト.getAs('image/jpeg')
Utilitiesサービス
最後のUtilitiesサービスは、講座で取り上げたメソッドの復習ということにしましょう。
Utilities.newBlob('名前,年齢\nBob,25\nTom,32', MimeType.CSV, 'name.csv')
Utilities.parseCsv(csvStrings)
Utilities.zip(blobs, 'cats.zip')
Utilities.unzip(zip)
Utilities.formatDate(d, 'JST', 'yyyy/MM/dd HH:mm:ss')
Utilities.sleep(50000)//千は秒。千は秒。
Utilities.formatDate
formatDate()メソッドの第2引数は、タイムゾーンを指定します。
第1引数 | 第2引数 | 第3引数 |
---|---|---|
Dateオブジェクト | タイムゾーン | 書式 |
d,dateなど | ‘JST’, ‘Asia/Tokyo’ | ‘yyyy/MM/dd HH:mm:ss’、’yyyy年M月d日 H時m分s秒’など |
書式の月は大文字です。ミニッツのmmと区別するためです。
タイムゾーンは、‘JST’でも ‘Asia/Tokyo’ でも大丈夫です。わたしはJSTで統一しています。
まとめ
以上で、「Utility services2」 をお届けしました。
次回は、 いよいよ最終回で 「HTTP通信・API」 をお届けします。