#24 文字列は何で囲む?
GAS のプログラムを作成しているときに、var と let の違いにも悩むけれど、"(ダブルクォーテーション)と '(シングルクォーテーション)の違いにも悩みませんか?
その辺りをちょっと確認してみました。
そもそもの定義は?
GAS のベースになっているのは JavaScript なので、そのリファレンスがどのように定義されているのかを、まず確認してみました。
すると、
と説明されています。要約すると、二重引用符(double quotes)、単一引用符(single quotes)、逆引用符(backtick)で文字列を指定できますよ、ということみたい。
確認のためのプログラム
作成したのは、次のようなプログラムです。変数を宣言して、その変数の初期値として文字列を設定し、その内容を console.log() で表示しているだけのプログラムで、動作には意味がありません。
二重引用符(ダブルクォーテーション)
C 言語をよく利用していた わたし としては、文字列をプログラム中に表記するのであれば、" を使うものだと思っていました。
3行目のように、文字列の両端を " で囲めば、その中が文字列として扱われます。
let mes1 = "’90 に"; // 文字列の両端は "(ダブルクォーテーション)でもOK
この " で囲まれた中には、’ が含まれていても構いませんが、” を表記するのであれば、11行目のように \ (日本語キーボードでは¥)を直前に付けてエスケープしてやらなければなりません。
let mes3 = "\"川\" と";
単一引用符(シングルクォーテーション)
” と同じように ’ でも文字列を表記できます。ただし、" で囲み始めたのであれば " で、' で囲み始めたのであれば ' で囲まなければなりません。
7行目のように、' で囲まれた中には " を含められます。
let mes2 = '"山" と'; // 文字列の両端は ’(シングルクォーテーション)でもOK
逆引用符(バッククォート)
更に、’ との区別はつきにくい感じがしますが、` でも囲めます。
前述の英語でのリファレンスでは、backtick と表記されていましたが、JIS などでは逆引用符(back quote:バッククォート)と表記されているようです。
let mes4 = `この中には " も ' だって記述できる。\` はエスケープが必要`;
逆引用符は、二重引用符や単一引用符と同じように文字列を囲むだけでなく、テンプレートリテラル(template literal)という機能も備えています。
21 ~ 24行目がテンプレートリテラルを使用した例です。
let mes6 = `${mes1}は
${mes2}
${mes3}
"海" に遊びに行った。`;
逆引用符の中に ${mes1} と表記することで、その部分に mes1 の変数の内容が代入されます。
また、逆引用符内には改行を含めることができるので、前述の実行結果のように改行して表示されます。ただし、スクリプトエディタ上でネスト(段下げ)された行頭の空白まで表示されるので注意が必要です。
このテンプレートリテラルを利用しない場合には、以下のように + で連結したり、\n で改行すれば、同じ結果が得られます。 ※下の例では、行頭のネストによる空白も出力するようにしています。
let mes7 = mes1 + "は\n" + " " + mes2 + "\n " + mes3 + "\n " + "\"海\" に遊びに行った。";
ただし、このテンプレートリテラルを利用する場合には、「プロジェクトの設定」で「Chrome V8 ランタイムを有効にする」がオンになっていなければなりません。多くの場合は、オンになっていると思いますが、うまく動作しない場合には、ここをチェックしてみましょう。
まとめ
いろいろ調べてみた結果は、上記の通りですが、わたし個人の感想も含めてまとめると以下のような感じです。
GAS で文字列を宣言する場合、二重引用符(")、単一引用符(')、逆引用符(`)のどれで囲んでも構わない。 ただし、逆引用符を利用する場合には、「プロジェクトの設定」に注意!
どの引用符で囲んでも構わないが、その文字列については同じ引用符で囲まなければならない。
使用している引用符の中に、その引用符を表記する場合にはバックスラッシュ(\)でエスケープする。
可読性(読みやすさ)を考えるのであれば、プログラム中で使用する引用符は統一されていた方がいいのではないか? ※文字列中に引用符を表記する場合には、バックスラッシュで対応
テンプレートリテラルはまだ一般的ではないように感じられるので、利用する場合には保守性(メンテナンスの容易さ)が低下しないように、テンプレートリテラルの動作についてもコメントが必要かも?
そもそも、単一引用符と逆引用符は判別し難いようにも感じられるので、個人的には二重引用符を使った方がわかりやすいのではないか、と思ったりしています。