見出し画像

#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 となっているので、確実に文字列が戻ってきます。

getDisplayValue() のリファレンス

getValue() は、戻り値が Object となっているので、セルの値に応じて Number、Boolean、Date、String のいずれかが戻ってくるので、型に応じた処理を行わなければなりません。

getValue() のリファレンス

セルの内容を文字列として扱いたいのであれば、getValue() ではなく、getDisplayValue() を使えば確実に String でセルの内容が得られるので便利です。ちょっと覚えておくと幸せになれると思います。😘

この記事が気に入ったらサポートをしてみませんか?