【GAS GoogleAppsScript | 初心者向け】スプレッドシートでよく使う関数を6つ紹介【Bot開発】

こんにちは、JavaScriptが大好きな書川(かきかわ)です。

毎日の業務の中で、誰かがやらないといけないけど続けていてもスキルアップにならないような作業あるよなーと思いハナホジ案件発生。
ハナホジしてる場合じゃねえ、自分の分身に仕事を任せてしまおう。そうしよう。

ここでは、Googleのスプレッドシートで管理しているデータをもとに、次に起こすべきアクションや、進捗の確認を行えるようになるための解説をします。

数学ができなくても、英語ができなくても、好きな子に振られてしまった人も、ダイエットが続かない人も、プログラミングと仲良くなれば自分が落ち込んで仕事に手がつかない時も、寝ている時もご飯を食べている時もしっかりと代わりに仕事を片付けてくれる。

そんなプログラミング言語を扱えるようになるために、これから始める方に向けて、普段からどんなコードを書いているかを紹介する。

過去にSlackに自動で通知する分身作っておりますのでぜひ見てあげてください。

GASを始めるにあたってスクリプトエディタを最初に準備しなくてはいけません。

上の記事で紹介しており1分で準備出来るので、是非ご覧ください。

それでは早速、GASでコードを書くときによく使う関数を解説していきます。

スプレッドシートを読み込む方法3パターン

スプレッドシートを読み込む方法は僕が知り得る中で、3パターンあります。
どれを使っても結果に変わりはないので、好きなものを選んでください。

スプレッドシートのURLからスプレッドシートを読み込む。

SpreadsheetApp.openByUrl()

スプレッドシートはエクセルのようなソフトではなく、ブラウザで管理しているのでURLがあります。そのURLをGAS特有の関数内に入れて使う方法です。

そのままURLを入れてもいいのですが、変数にURLに代入するとこの後に書いていくコードが整ってスッキリします。

var sheet_url = 'https://docs.google.com/spreadsheets/d/**************************';
var ss = SpreadsheetApp.openByUrl(sheet_url);

スプレッドシートのIDからスプレッドシートを読み込む関数3パターン。

SpreadsheetApp.openById()

次は、URLを使う方法にとても似ているやり方です。スプレッドシートのURLにあるIDの部分だけを抜き出して、GAS特有の関数内に入れて使う方法です。

/* SpreadsheetのURL
https://docs.google.com/spreadsheets/d/[ここを抜き出す]/edit#gid=0
*/
var ss = SpreadsheetApp.openById('抜き出した文字列をここに入れる');

アクティブになっているスプレッドシートを認識する。

こちらの場合は、コピペでURLやIDを認識させるのではなく、アクティブになっているシートをスクリプトが判断して処理を実行します。

こちらも変数に入れてからGAS特有の関数内に入れて使うとスッキリするかもしれません。
複数のシートを持っている時、アクティブになっているシートがどれなのかスクリプトに判断してもらえるか心配しているので、僕はあまり使わないです。心配性なだけです。

/*アクティブなシートのURLを変数に代入します。*/

var ss_Url = SpreadsheetApp.getActiveSpreadsheet()

var ss_1 = SpreadsheetApp.openByUrl(ss_Url);

/*アクティブなシートのIdを変数に代入します。*/

var ss_Id = SpreadsheetApp.getActiveSpreadsheet().getId()

var ss_2 = SpreadsheetApp.openById(ss_Id);

シートを認識させる関数

getSheetByName(‘ [シート名]’);

シート認識する関数は、スプレッドシートを読み込む関数とペアで使われることが多いです。

//基本的な形です。
var sheet = SpreadsheetApp.openById('[ここにスプシのIDをコピペ]').getSheetByName('シート名');

//複数のシートにも対応できる書き方
var ss = SpreadsheetApp.openById('[ここにスプシのIDをコピペ]');
var sheet1 = ss.getSheetByName('シート名1');
var sheet2 = ss.getSheetByName('シート名2');

セルの値を取得する関数

getRange(列, 行).getValue();

セルの名前は
・A,B,C,,,といった横列を「列」、「row(ロウ)」と呼び
・1,2,3,,,といった縦列を「行」、「column(カラム)」と呼びます。

実際に、A列1行目に何か文字を入力してみてください。この関数の前に、シートを取得した関数を代入した変数を使うと見た目がスッキリします。

セルの値を取得するコードはめちゃくちゃ重要です。
SlackのBot開発の記事でも書いているので理解の助けになれば嬉しいです。

実際の開発では、変数nなどを用いたループでセルの取得を行うから100とか1000のセル情報を取得することが可能です。

var ss = SpreadsheetApp.openById('[ここにスプシのIDをコピペ]');
var sheet1 = ss.getSheetByName('シート名1');

var range = sheet1.getRange("A1");//セルA1を取得
var range = sheet1.getRange(1, 1);//セルA1を取得

デバッグして、スクリプトの実行内容を確認する方法

例えば、上記のコードで変数に、セルのA列1行目の内容を代入するコードを書いたのですが、その内容が複雑化してくると毎回セルの内容を確認するには時間が掛かることもあります。

その時にはログを確認することですぐに解決します。以下のコードを追記することでデバックを実行します。

//スクリプトのログを確認する方法
Logger.log();

■ノンコードでデバックするには、虫マークをクリックしてください。

How to debug with GAS

■その後にメニューの 「表示」 → 「ログ」 を実行してください。

How to view logs in GAS

僕はMacユーザーなのでMacよりの説明になりますがもっと早くログの内容を見るには、虫マークを押す → [ ⌘ + enter(return) ]を実行してみてください。

セルに値を入力する関数

getRange(row, column).setValue([入力したい値]);

セルを指定して、入力したい値を設定出来ます。

・値を取得するときは、[ getValue(); ]

・値を入力するときは、[ setValue(); ]

get と set を見間違えそうですね。

var ss = SpreadsheetApp.openById('[スプシのURLの中のID]');
var sheet = ss.getSheetByName('[シート名]');

//スプシのセルA列の2行目の値を入力する関数の書き方です。
var A2 = sheet.getRange(1, 2).setValue("✓");

こちらを実行すると、セルA列の2行目に 「✔︎」 が入力されます。
実務ではメール送信完了だったり、通知完了の合図として使いました。本日の日付を取得して完了日の入力などにも使えますね。

アイデア次第で何にでも活躍できそうです。

最後の行を取得する方法2パターン

最後の行を取得できるようになると、自動化への道が開けてくるんです。

スプシの中の最終行を取得する。

//最終行を取得する。その1
var sheet = SpreadsheetApp.getActiveSheet(); 
var LastRow = sheet.getLastRow()

取得したい列の範囲を指定して、最終行を取得する方法

・filter(String) →指定した範囲の値が文字列であるものをフィルタリングします。
・length →要素数を取得します。

//最終行を取得する。その2
// A列の値を配列で取得する。
var columnA= sheet.getRange('A:A').getValues(); 

//空白のセルを除いて、配列の数を取得する。
var LastRow = columnA.filter(String).length; 
Logger.log(LastRow);

これら二つの方法のどちらが良いかは決められませんが、後者の方が列を指定できる分、処理が早くなりそうですよね。

とはいえケースバイケースだと思います。僕は前者を使います。楽なので。限られた人生で楽するのは大事です。

日付をクレンジングする方法

自動化するには、GASに人間が使う日付を理解させないといけない状況が出てきます。

//現在の日付を取得します。
var nowDate = new Date();
//時間以外の年月日だけを取得します。これだけではまだ使えるデータではありません。
var a = new Date(nowDate.getYear(), nowDate.getMonth(), nowDate.getDate());
Logger.log(a);

//西暦と月と日付に変換します。
var today = Utilities.formatDate(a,'JST','yyyy/MM/dd');
Logger.log(today);

以上が、僕がBotを初めて開発する時に知りたかった関数です。

そんな感じです。


Asset
20 Posts
Bygone
28 Posts
Coding
14 Posts