どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年9月から始まりました「ノンプロ研GAS中級講座6期」について、全7回でお届けします。今日はDay3です。
前回のおさらい
前回は、「クラス・ライブラリ」 をお届けしました。
今回は、 「組み込みオブジェクト」 をお届けします。
今日のアジェンダ
- 組み込みオブジェクト
- Stringオブジェクト
- Arrayオブジェクト
- Dateオブジェクト
- Mathオブジェクト
組み込みオブジェクト
Google Apps Scriptは、JavaScriptをベース としたプログラミング言語です。
JavaScriptには、ユーザーがよく使うであろうメンバーが定義された「標準組込みオブジェクト(Built-in Object)以降、組込みオブジェクト」があります。
とても、たくさんの組込みオブジェクトがありますが、GASで使うのはその一部です。
GAS本第3版に掲載されている組込みオブジェクトは、下記10種です。
この中でも厳選して、みなさんがよく使うだろうなぁという組み込みオブジェクトを、講座ではご紹介しました。
これらは、「○○オブジェクト」ですので、このようにドット記法を用いて、メンバーを呼び出します。(ブラケット記法は使えません。)
○○オブジェクト.メンバー
グローバルオブジェクト
GASで組み込みオブジェクトを使えるのは、グローバルオブジェクトとして、あらかじめ定義されているからです。
グローバルオブジェクトを確認してみましょう。
新規プロジェクトを立ち上げて、myFunction()の中に、適当な変数を書いて保存します。
function myFunction() {
a;
}
ブレークポイントをおいて、デバッグを実行しましょう。
Globalの折りたたみをクリックして、中身を確認します。
だーっと表示される中身が、グローバルオブジェクトです。
今回、すべてのグローバルオブジェクトを書き出しました。どうやら、98レコードあるようです。
- Object: function() {-}
- Function: function() {-}
- Array: function() {-}
- Number: function() {-}
- parseFloat: function() {-}
- parseInt: function() {-}
- Infinity: Infinity
- NaN: NaN
- undefined undefined
- Boolean: function() {-}
- String: function() {-}
- Symbol: function() {-}
- Date: function() {-}
- Promise: function() {-}
- RegExp: function() {-}
- Error: function() {-}
- EvalError: function() {-}
- RangeError: function() {-}
- ReferenceError: function() {-}
- SyntaxError: function() {-}
- TypeError: function() {-}
- URIError: function() {-}
- globalThis: global {-}
- JSON: JSON {-}
- Math: Math {-}
- Intl: {-}
- ArrayBuffer: function() {-}
- Uint8Array: function() {-}
- Int8Array: function() {-}
- Vint16Array: function() {-}
- Int16Array: function() {-}
- Vint32Array: function() {-}
- Int32Array: function() {-}
- Float32Array: function() {…}
- Float64Array: function() {-}
- Vint8clampedArray: function() {-}
- Biguint64Array: function() {-}
- BigInt64Array: function() {…}
- DataView: function() {-}
- Map: function() {-}
- BigInt: function() {…}
- Set: function() {-}
- WeakMap: function() {…}
- WeakSet: function() {…}
- Proxy: function() {…}
- Reflect: {…}
- decodeURI: function() {-}
- decodeURIComponent: function() {-}
- encodeURI: function() {…}
- encodeURIComponent: function() {…}
- escape: function() {…}
- unescape: function() {…}
- eval: function() {…}
- isFinite: function() {…}
- isNaN: function() {…}
- SharedArrayBuffer: function() {…}
- Atomics: Atomics {…}
- FinalizationRegistry: function() {…}
- WeakRef: function() {…}
- WebAssembly: WebAssembly {…}
- Browser: {…}
- CacheService: {…}
- Calendar App: {…}
- CardService: {…}
- Charts: {…}
- ConferenceDataService: {…}
- ContactsApp: {…}
- Content Service: {…}
- DataStudioApp : …)
- Document App: {…}
- DriveApp: {…}
- ErrorService: {…}
- FormApp: {…}
- GmailApp: {…}
- GroupsApp: {…}
- HtmlService: {…}
- Language App: {…}
- LinearOptimizationService: {-}
- Lock Service: {…}
- Logger: {…}
- MailApp: {…}
- Maps: {…}
- MimeType: {}
- PropertiesService: {…}
- ScriptApp: {…}
- Script Properties: {-}
- Session: {…}
- SitesApp: {-}
- SlidesApp: { }
- SoapService: {…}
- SpreadsheetApp: {…}
- UiApp: {}
- UrlFetchApp: {…}
- User Properties: {…}
- Utilities: {}
- XmlService: {…}
- console: {…}
- Jdbc: {…}
値プロパティ
グローバルオブジェクトと、ひとくくりにしてしまいましたが、中にはプロパティもあります。
これらのグローバルプロパティは、値を返します。内部にプロパティもメソッドも持ちません。
- Infinity
- NaN
- undefined
- globalThis
GWSトップレベルオブジェクト
みなさん大好きGoogle Workspaceのトップレベルオブジェクトも、グローバルオブジェクトに顔を並べています。
- Calendar App: {…}
- CardService: {…}
- ContactsApp: {…}
- DataStudioApp : …)
- Document App: {…}
- DriveApp: {…}
- FormApp: {…}
- GmailApp: {…}
- Language App: {…}
- Logger: {…}
- PropertiesService: {…}
- ScriptApp: {…}
- Script Properties: {-}
- Session: {…}
- SlidesApp: { }
- SpreadsheetApp: {…}
- UiApp: {}
- UrlFetchApp: {…}
parseIntとparseFloatメソッド
Number関数の他に、取り扱う数値が「整数」なのか「浮動小数点」なのかによって、文字列型を数値型に変換するメソッドが2つあります。
- Number()・・・数値型として返す
- parseInt・・・整数を返す
- parseFloat・・浮動小数点を返す
このメソッドは、各2種類あり、1つは、組み込みオブジェクトの「Numberオブジェクト」のメソッドです。
//整数を返す
Number.parseInt(string)
//浮動小数点を返す
Number.parseFloat(string)
もう1つは、「最上位関数」の2つのメソッドです。
//整数を返す
parseInt(string)
//浮動小数点を返す
parseFloat(string)
使い分けをする場面はあまりないと思いますが、社内コーディングガイドラインを作成したり、統一することが望ましいです。(私は最上位関数で書きます。)
//整数を返す
console.log(Number.parseInt('100歳'));
console.log(parseInt('100歳'));
//浮動小数点を返す
console.log(Number.parseFloat('42.195km'));
console.log(parseFloat('42.195km'));
同様に、文字列型に変換するString()系のメソッドも2種類ありますが、社内コーディングガイドラインを作成したり、統一することが望ましいです。(私はtoString()が好きです。)
//String関数
console.log(String(['hoge']));
//toString()メソッド
console.log(['fuga'].toString());
split()メソッド
文字列の分割を行うのは、Stringクラスの split()メソッド です。
構文は以下のようになっていて、区切り文字が現れるたびに、分割した文字列を 配列 で返します。第2引数の 分割数 は省略できますが、指定されると分割数に達すると 停止 します。
str.split(区切り文字・正規表現, 分割数);
スプレッド構文と分割代入
ドット3つ(…)で、配列の要素を展開するスプレッド構文ですが、仮引数として受けることもできます。
そのような記法をレスト構文と呼びます。
- スプレッド構文・・・要素を展開する
- レスト構文・・・・・要素を集約する
サンプルコードを実行してみましょう。
function myFunction3_06_2() {
const numbers = [2, 3, 4];
console.log([0, 1, numbers, 5]);//[0, 1, [2, 3, 4], 5]
console.log([0, 1, ...numbers, 5]); //[0, 1, 2, 3, 4, 5]
/** 引数を返す関数 */
const func = (numbers) => { return numbers };
//func(2, 3, 4)と同じ意味
console.log(func(...numbers)); //2
//func([2, 3, 4])と同じ意味
console.log(func(numbers)); //[2, 3, 4]
/** レスト構文 */
const func2 = (...numbers) => { return numbers };
console.log(func2(...numbers)); //[ 2, 3, 4 ]
}
スプレッド構文と分割代入との組み合わせで、このように書くことができます。
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const [headers, ...records] = sheet.getDataRange().getValues();
console.log(headers);
console.log(records);
レスト構文については、こちらのブログも参考にしていただければ幸いです。
反復メソッド
filter、map、reduceメソッドは、3大コールバック関数と呼ばれ、配列を操作するために重宝していくメソッドです。
コールバック関数のおさらいをしましょう。コールバック関数とは、 「引数に関数を持たせた関数」 でした。そして、引数に関数をもたせるために、「関数リテラル」を使うことを初級講座で習いましたね。
以下は、関数リテラルの省略記法である「アロー関数」を使って、関数の引数に関数を持たせたコードです。
function myFunction() {
const array = ['a', 'b', 'c'];
const func = (element, index) =- {
return [element, index];
}
const mappedArray = array.map(func);
console.log(mappedArray); //[ [ 'a', 0 ], [ 'b', 1 ], [ 'c', 2 ] ]
}
filter()メソッドや、map()メソッドの場合、以下の3つの引数が重要になります。
- 第1引数(elementやvalueなど)・・・順番に渡される配列の要素
- 第2引数(indexやiなど)・・・要素のインデックス
- 第3引数(arrayやarrなど)・・・操作されている要素の元の配列
コールバック関数をネストしだすと、思わぬところで第2引数のindexが活躍したりします。慣れるまで経験が必要かもしれませんが、積極的に反復メソッドは使うようにしましょう。
Dateオブジェクト
Dateオブジェクトを操作するばあいは、必ずnewするというのが決まりでした。
そして、Dateオブジェクト生成するパターンは、以下の4つです。覚えてしまいましょう。
//処理を実行した日付時刻が取れる。
new Date();
//月だけゼロ始まり。日を含む以降は省略できる。
new Date(2020, 2, 14, 19, 30, 15);
//スペース注意。日以降は省略できる
new Date('2020/02/14 19:30:15');
//タイムスタンプとかUnixエポックと呼ばれる
new Date(1577804400000));
また、よく使う日付の加算なども、スニペットに加えてしまいましょう。
//日時の加算には、new Date(2020, 2, 14, 19, 30, 15);タイプを使う。
const d = new Date();
const date = new Date(d.getFullYear() + 1, d.getMonth() + 1, d.getDate() + 1);
//日付のフォーマットを変換する
const strDate = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd HH:mm:ss');
//月末と先月初
const d = new Date();
const first = new Date(d.setDate(1)); //月初
const end = new Date(d.setDate(0)); //先月末
まとめ
以上で、「組み込みオブジェクト」 をお届けしました。
前回の講座で、PersonやOnigiriクラスを自作しました。
クラスからインスタンスを生成すると、プロパティやメソッドを呼び出すことができました。
「組み込みオブジェクト」は、先人たちが用意してくれた、便利なクラス群です。
わたしたちが、文字列に関する操作や日付に関する操作を行うクラスを自作しなくても、メンバーを呼び出すだけで処理できます。ありがたいお話ですね。
次回は、 「Utilities Services1」 をお届けします。