#112 見えているままの文字列を取得する
いろいろと表計算ソフトで扱っている業務を自動化しようと、GAS でえプログラムを作成しているときに、ちょっとハマった内容があったので、まとめておきます。
結論としては、getValue メソッドに似た getDisplayValue メソッドの紹介です。
確認のために作成したプログラム
ハマった内容を確認するためのプログラムは、↓ のような感じ。
// @OnlyCurrentDoc
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange('A1').setValue('1234');
sheet.getRange('A2').setValue('0131');
sheet.getRange('A3').setValue('31 Jan');
sheet.getRange('A4').setValue('1/31');
sheet.getRange('A5').setValue('1-31');
// セルの内容を変数に読み込む
let str1 = sheet.getRange('A1').getValue();
let str2 = sheet.getRange('A2').getValue();
let str3 = sheet.getRange('A3').getValue();
let str4 = sheet.getRange('A4').getValue();
let str5 = sheet.getRange('A5').getValue();
console.log(str1, ':', typeof (str1)); // 1234 ':' 'number'
console.log(str2, ':', typeof (str2)); // 131 ' - ' 'number'
console.log(str3, ':', typeof (str3)); // 31 Jan - string
console.log(str4, ':', typeof (str4)); // Wed Jan 31 2024 00:00:00 GMT+0900 (Japan Standard Time) ' - ' 'object'
console.log(str5, ':', typeof (str5)); // Wed Jan 31 2024 00:00:00 GMT+0900 (Japan Standard Time) ' - ' 'object'
sheet.getRange('B1').setValue(str1);
sheet.getRange('B2').setValue(str2);
sheet.getRange('B3').setValue(str3);
sheet.getRange('B4').setValue(str4);
sheet.getRange('B5').setValue(str5);
}
このプログラムは、セル A1 ~ A5 に setValue メソッドで以下のような値を設定し、getValue メソッドで取得すると、どのような結果になるかを確認したものです。
1234
0131
31 Jan
1/31
1-31
プログラムの挙動
このプログラムを実行すると、以下のような結果になります。
入力した内容は、setValue メソッドでセルに設定すると、上図のようにセルに格納され、以下のような挙動となります。
1234
→ 1234 (Number) ※数字として認識され、右寄せ表示0131
→ 131 (Number) ※数字と解釈されて、先頭の 0 が消える31 Jan
→ 31 Jan (String) ※文字列として認識されている1/31
→ 1/31 (Object) ※日付として認識されている1-31
→ 1-31 (Object) ※日付として認識されている
セル A4 と A5 にはプログラムで設定したまま「1/31」や「1-31」と表示されているものの、日付として認識されているので、それぞれのセルをクリックして数式バーを見ると「2024/01/31」と表示されています。
プログラムでは setValue メソッドには文字列として与えられたものが、内容によって Google スプレッドシートは、数字や文字列、日付として認識して、右寄せで表示したりしています。
プログラムでは、setValue メソッドで設定した内容を、getValue メソッドで再取得して、列 B に setValue メソッドで設定しています。セル B4 と B5 については、プログラムのログでは「Wed Jan 31 2024 00:00:00 GMT+0900 (Japan Standard Time)」と扱われているようですが、数式バーに表示されている内容「2024/01/31」が表示されています。
何にハマった?
Google スプレッドシートで入力されている内容を処理しようとしたときに、セルの内容を文字列(String)として処理しようとしたところ、前述の「1234」のように数字だけで入力されたセルや、「1-31」のように入力されているセルが文字列として扱われませんでした。
「1234」 → 数字(Number)
「1-31」 → 日付(Object)
具体的には… 文字列として扱われていれば、↓ の URL で説明されているような startsWith メソッドが利用できなかったのです。😖
プログラムの中でも使っている typeof メソッドによって、変数の中身がどんな型(形式)なのかを確認して、処理を分けようかとも思いましたが…
試行錯誤していて見つけたのが、getDisplayValue() というメソッド。
この getDisplayValue() は、メソッドの戻り値が String となっているので、確実に文字列が戻ってきます。
getValue() は、戻り値が Object となっているので、セルの値に応じて Number、Boolean、Date、String のいずれかが戻ってくるので、型に応じた処理を行わなければなりません。
セルの内容を文字列として扱いたいのであれば、getValue() ではなく、getDisplayValue() を使えば確実に String でセルの内容が得られるので便利です。ちょっと覚えておくと幸せになれると思います。😘