GoogleAppsScriptを0から学んで、家族と過ごす時間を手に入れましょう➁
GoogleAppsScriptからSpreadSheetへの連携しよう
GASが出来るとどんな良い未来が想像できるの?
については以下のnoteで記載しておりますので、こちらをご覧でない方、ご興味あればご覧ください。
GASを基礎から学ぶ為の資料もこちらから見ることが出来ます🙏
結論
今回の内容がわかっているとGoogleAppsScriptからSpreadSheetに連携することが出来るようになります。
連携できるようになると何がいいの?
例えば各店舗から送られてくる日報や報告書を一つのスプレッドシートにまとめなきゃいけない、そんな場合に役に立ちます。
手作業でやっていた作業が自動化できて、家族と過ごす時間を増やすことが出来ます。
夜帰ってきて家族とゆっくりコミュニケーションが取れる時間が確保でき、家族円満、豊かな生活を手に入れましょう。
前提
- スクリプトエディタ(プログラムコードを書かところだよ)でコードの書くまでの手順が分かっている
- GoogleSpreadSheetの基本の使い方(セルに文字を入力など)がわかっている
- 変数や定数などの理解が出来ている。
基本の理解
なんとなくで覚えていると毎回毎回調べる羽目になるため、しっかりと基礎の部分の仕組みを理解し、こう書けばこの挙動になるはずだ。という部分を意味を理解できるような解説をしていきたいと思います。
理解の仕方(勉強の仕方)について
コードの内容を読むだけではなく、
コードを書く→コードの実行→ログや結果を確認
これを繰り返しやっていきましょう。
こうすることで読んでわからなかったことが、実行に移すことで理解につながります。
この方法は、僕も含め多くのエンジニアさんが口をそろえて言っていることなので間違いありません。
とにかくこれは意識してやってみましょう‼︎
SpreadsheetApp.getActive(),
getSheetByName(),
openByUrl(),
getDataRange(),
getValues()の理解
まずはスプレッドシートを開いて以下のように名前、食べたいものを入力し、準備しましょう。
シートの名前はなんでも良いのですが、このシート名称とコードに記述するシート名称は合わせる必要がありますので、そこの認識だけしておきましょう。(言ってる意味わかるかな?この資料では「配列」というシート名称にしております。)
(ノンプログラマ向け社内GASレクチャーから引用)
まずコード全体
// getDataRangeとgetRangeの違い
function RangeTest () {
// 配列という名前のシートをssの定数に格納する
const ss = SpreadsheetApp.getActive().getSheetByName('配列');
// ss = 配列シート
// ssのgetDataRange
const sheet = ss.getDataRange().getValues();
console.log(sheet);
// 出力結果:配列シートのすべての値が出力される
}
上記のコードを実行してログを確認すると、以下のようになります。
コードの実行はwindowsの場合、Ctrl+R
ログの表示はCtrl+Enter
結果はすべての値が取得されていることがわかります。
解説:SpreadsheetApp.getActive().getSheetByName()
const ss = SpreadsheetApp.getActive().getSheetByName('配列');
上記のコードはよく出てきますが、こちらもなんとなくで記述している場合は、日本語に訳してみるとどういったことをしているか?が分かりやすくなるかと思います。
SpreadsheetApp.getActive().getSheetByName('配列')
上記を日本語にすると、
SpreadsheetApp.getActive():
GoogleAppsScriptから、スプレッドシートという物にアクセスして、getActive()でアクティブなスプレッドシートを指定(アクティブであるとは、今開かれているスプレッドシートのことです。開かれていなければアクティブではないとも言えます。)
getSheetByNameで'配列'という名前のシートをゲットして、ssという定数にそのシートを入れてね。という解釈になります。
図にするとこんな感じ。イメージ湧きますかね?
解説:openById()
getActive()ではアクティブであるスプレッドシート、つまり今現在開かれているスプレッドシートを指定して取得しましたが、アクティブな状態ではないスプレッドシートを取得したい場合にopenById()でスプレッドシートのIDを指定して取得する方法があります。
まずは、適当に今作業しているスプレッドシートとは別のスプレッドシートを準備しましょう。
名前はなんでも良いのですが、「アクティブでないスプレッドシート」という名前で作りました。
中身のなんでも良いのですが、以下のように何かしら文字を入力しましょう。
以下に示すURLが表示されている、d/~後、/editよりも前の値が、そのスプレッドシートを識別するためのIDとなりますのでこちらをコピーしておきます。
https://docs.google.com/spreadsheets/d/xxxxxxxx/edit#gid=0
コピーして、このシートを作ったら一旦閉じておきます。(アクティブではない状態にします)
ではコードを記載します。
// OpenByIdでのスプレッドシート連携
const NotActive = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxxx');
const sheet3 = NotActive.getDataRange().getValues();
console.log(sheet3);
openById('xxxxxxxxxxxxxxxxxxxxxx')の「xxxxx」の部分には先ほどコピーしたIDを貼り付けてください。()の中には必ず「''」シングルクォーテーション、またはダブルクォーテーションで貼り付けたIDを囲っておいてください。
これをしておかないとエラーの原因になります。
これでCtrl+RでScriptを実行させてみると以下のように認証画面が出ますので、許可を確認をクリックしてください。
アカウントを選択します。
詳細を選択します。
許可をします。
無題のプロジェクト(安全でないページ)に移動を選択します。
ここまで来ればアクティブじゃないシートにアクセスすることができます。
もう一度スクリプトエディタで実行→ログの確認をしてみましょう。
以下のようにアクティブじゃないスプレッドシートにアクセスできました。
これを覚えておくことで、「あのスプレッドシートからデータ抜き取りたいんだよな」が可能になりますので、ぜひ覚えておきましょう。
解説:getDataRange()
// ss = 配列シート
// ssのgetDataRange
const sheet = ss.getDataRange().getValues();
次にgetDataRangeについてです。
まず、ss.getDataRange()がどういう意味か?になりますが、
ss = 「配列のシート」がssという定数の中に入っています。
ss.(ドット)とすることで、「配列シートの」という意味になります。
getDataRange()は指定したシート、ここで言う'配列'シートのDataRange、Rangeつまり、
「範囲」をゲットするという意味です。
繋げるとss.getDataRange→配列シートの範囲をゲットすると解釈できます。
そのあとに続くgetValues()ですが、こちらは値、「Values」複数形なので一つの値ではないことが分かります。
複数の値をゲットすると解釈できます。
getDataRange().getValues()とすることですべての空白でない値を取得する
ということになります。
ではssからすべて繋げてみると
ss.getDataRange().getValues()です。
スプレッドシートの'配列'シートの値をすべて取得して、const sheetに格納してね。ということになります。
よくオブジェクトと言われるものですが、このスプレッドシートという物体、いわゆるオブジェクトと解釈することが出来ます。
「sheet」という定数はスプレッドシートの配列シートの中にあるすべての値を持った物体 = オブジェクトです。
解説:getRange()
そこまでわかったところで今度はgetRange()について解説します。
getRangeの使い方としてはRangeつまり範囲を指定して値を取得することが出来ます。
先ほど使用した表をもう一度見ながら解説していきます。
ではまず「A5」単一の値を取得したいなとなった場合ですが、以下のように指定します。
const sheet2 = ss.getRange('A5').getValue();
複数の指定した範囲A3~B5までの値を取得したいとなった場合には、getRangeには以下のように指定します。
const sheet2 = ss.getRange('A3:B5').getValues();
注意しなければいけない点は複数の値を取得する場合には
getValue()⇒getValues()と複数系にする必要があります。
console.log(sheet2)で結果を確認してみましょう。
指定した範囲の値が取得できたかと思います。
また、getRangeの指定の仕方は次のようにすることも可能です。
const sheet2 = ss.getRange(5, 1).getValue();
console.log(sheet2)でログを確認すると
const sheet2 = ss.getRange('A5').getValue();
上記コードと同じ結果が出力されているのがわかるかと思います。
こちらはgetRange(行, 列)意味で、5行目の1列目の値を取得しています。
でも行、列だけの指定では複数の値は取れないのでは?
と思うかもしれませんが、複数の行列の値を取得する場合には以下のように指定します。
const sheet2 = ss.getRange(3,1,3,2).getValues();
上記をconsole.logで結果見てみると以下の値が取得できたかと思います。
getRange(3,1,3,2)⇒ここの部分の解説ですが、なんとなくわかった方もいらしゃるかと思いますが、(開始行, 開始列, 〇行分〇列分)取得する
数字を当てはめると(3行目の, 1列目から, 3行分, 2列分)取得するということになります。
今回のnoteはここまでにします。
GoogleAppsScriptからスプレッドシートへのアクセスするための理解
スプレッドシートの値を取得するための方法
ここの基礎固めをしっかりすることで、後に複数のスプレッドシートから値を一つのシートにまとめ上げることが可能となりますので、ぜひ勉強してみてください。
ここまでいかがでしたでしょうか?理解の手助けになりましたでしょうか?
こちらのnoteがわかりやすかったという方はいいねやフォローをいただけたら嬉しいです。
カイリーー(@kyrieee)という名前でTwitterでも情報提供していますので、是非ともご意見、ご感想などお待ちしております。
また、ブログも運営しております。
普段プログラミング学習で思うようにできず、悩んでいる、学習の仕方がわからない、エンジニアってどんなことしているの、など
プログラミングにおけるマインドについて情報発信しております。