Open2
GAS基本&応用(学習備忘録)

階層構造について
- 階層構造が操作対象になる。
- 操作対象のことをクラスと呼ぶ(sheetクラスとか)
- クラスに対する命令(実行内容)のことをメソッドと呼ぶ
- sheetクラスを操作したいときは、ダイレクトにsheetクラスを指定することはできないため、最上位階層のSpreadsheetAppクラスから、一つづつブレークダウンしていく必要がある
SpreadsheetAppクラス
スプレッドシートのアプリ本体を指す
SpreadssheetAppクラス
スプレッドシートの各ファイルを指す
sheetクラス
各シートを指す
Rangeクラス
セルの範囲を指す
Rangeクラス以降
valueとかについては、セルに入っている値とかを取得できる
SpreadsheetApp層から、Spreadsheet層の取得
- openById(id)
- id指定でスプレッドシートを取得する
▼spreadsheetクラス取得
function myFunction() {
// Class.Method(パラメータ)が、GASの基本文型になる
// openById(id)のidの部分をパラメーターと呼ぶ
const ss = SpreadsheetApp.openById("ここにIDを入力する");
Logger.log(ss)
}
```jsx
▼ファイル名取得
function myFunction() {
// Class.Method(パラメータ)が、GASの基本文型になる
// openById(id)のidの部分をパラメーターと呼ぶ
const ss = SpreadsheetApp.openById("ここにIDを入力する");
const name = ss.getName();
// sheet名を取得する。getNameメソッドは、パラメータ指定がいらない
Logger.log(name)
}
実行ログ
14:53:09 お知らせ 実行開始
14:53:09 情報 Google スプレッドシートの階層構造
14:53:10 お知らせ 実行完了
-
openByUrl(url)
- url指定でスプレッドシートを取得する
- url丸々指定する
- url指定でスプレッドシートを取得する
-
getActiveSpreadsheet(パラメータ指定なしで大丈夫)
- アクティブなSpreadsheetクラスを取得する
- アクティブなSpreadsheetクラスとは、GASと紐づいたスプレッドシートのことを指している
- スプレッドシートの拡張機能タブからGASを開いた場合は、その時点でスプレとGASが紐づいている
- スプレッドシートとGASが紐づいていれば、idとかの入力が省ける
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const name = ss.getName(); // sheet名を取得する。getNameメソッドは、パラメータ指定がいらない Logger.log(name) } 実行ログ 14:59:03 お知らせ 実行開始 14:59:03 情報 Google スプレッドシートの階層構造 14:59:04 お知らせ 実行完了
- アクティブなSpreadsheetクラスを取得する
Spreadssheet層からsheet層の取得
- getSheetByName(name)
- シート名を指定してメソッドを実行する
▼シートクラス取得
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シート名");
Logger.log(sheet);
}
実行ログ
15:08:08 お知らせ 実行開始
15:08:08 情報 Sheet
15:08:08 お知らせ 実行完了
▼シート名取得
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シート名");
const name = sheet.getName();
Logger.log(name);
}
実行ログ
15:10:00 お知らせ 実行開始
15:10:00 情報 シート1
15:10:01 お知らせ 実行完了
- getActiveSheet();
- getActiveSpreadsheetの仲間
- アクティブなシートを取得する
- 「アクティブなシート」がリファレンスに定義されていないらしい
- 必ずしも、現在スプレ上で表示しているシートが「アクティブなシート」と判定される訳では無いらしい
- 調べると、setActiveSheet(sheet)でシートをアクティブにするみたい
- 必ずしも、現在スプレ上で表示しているシートが「アクティブなシート」と判定される訳では無いらしい
Spreadssheet層からsheet層の取得
- getRange(range, column)
- 単一セル範囲の取得
- getRange(row, column, numRows, numColumns)
- 複数セル範囲の取得
- numRows = 行数
- 複数セル範囲の取得
- getA1Notationメソッドで、セル番地を取得できる
▼Range取得
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("taraco");
const range = sheet.getRange(2, 1);
Logger.log(range);
}
実行ログ
16:05:49 お知らせ 実行開始
16:05:49 情報 Range
16:05:50 お知らせ 実行完了
▼単一のセル番地取得
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("taraco");
const range = sheet.getRange(2, 1);
const name = range.getA1Notation();
Logger.log(name);
}
実行ログ
16:11:42 お知らせ 実行開始
16:11:42 情報 A2
16:11:43 お知らせ 実行完了
▼複数のセル番地取得
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("taraco");
const range = sheet.getRange(1, 1, 5, 1);
const name = range.getA1Notation();
Logger.log(name);
}
実行ログ
17:01:31 お知らせ 実行開始
17:01:31 情報 A1:A5
17:01:32 お知らせ 実行完了
Range層からValue層の取得
※getValuesの際は、行ごとに、二次元配列で取得される
▼A1セルの値を取得
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getRange(1,1);
const value = range.getValue();
Logger.log(value);
}
実行ログ
17:20:56 お知らせ 実行開始
17:20:57 情報 sample
17:20:57 お知らせ 実行完了
▼getValuesで、複数セルの値を取得する①(行ごとに、二次元配列で取得される)
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getRange(1,1,4,3);
const values = range.getValues();
Logger.log(values);
}
実行ログ
17:25:50 お知らせ 実行開始
17:25:51 情報 [[1.0, 2.0, 3.0], [2.0, 4.0, 6.0], [3.0, 6.0, 8.0], [4.0, 8.0, 12.0]]
17:25:51 お知らせ 実行完了
▼getValuesで、複数セルの値を取得する②(行ごとに、二次元配列で取得される)
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getRange(1,1,3,2);
const values = range.getValues();
Logger.log(values);
}
実行ログ
17:33:53 お知らせ 実行開始
17:33:53 情報 [[名前, 星座], [田中太郎, いて座], [山田太郎, おうし座]]
17:33:54 お知らせ 実行完了
▼getValuesで、複数セルの値を取得して、さらにその中から一部の情報を取得したい(二次元配列から情報を取得する)
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getRange(1,1,3,2);
const values = range.getValues();
const name = values[1][0];
// values[1][0]の中身には、行番号と、列番号が該当する
// 0から始まるので注意
// このデータの場合は、1行目の0列目なので、[1][0]となる
// getRangeの場合は、1始まりなので、注意する
Logger.log(name);
}
実行ログ
17:38:31 お知らせ 実行開始
17:38:31 情報 田中太郎
17:38:32 お知らせ 実行完了

データの行数を自動で算出したい
考え方は、「データが入っている最後の行番号」から「不要な行数」を引いた値になるはず
不要な行数は普遍のはずなので、データが入っている最後の行数を取得する
getLastRowで、データの最終行を取得する
▼10行目までデータが入っていて、-6している
function getEvents() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("検索条件");
const rows = sheet.getLastRow()-6;
Logger.log(rows);
実行ログ
15:03:54 お知らせ 実行開始
15:03:59 情報 4.0
▼条件部分の値を取得する
function getEvents() {
// シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("検索条件");
// メンバーのアドレス一覧を取得
const rows = sheet.getLastRow()-6;
const range = sheet.getRange(7,2,rows,1);
const addresses = range.getValues();
// 検索条件の取得
const conditionsRange = sheet.getRange(7,4,1,7);
const conditions = conditionsRange.getValues();
Logger.log(conditions)
実行ログ
15:34:06 お知らせ 実行開始
15:34:11 情報 [[Tue Nov 07 00:00:00 GMT+09:00 2023, Thu Nov 09 00:00:00 GMT+09:00 2023, Sat Dec 30 08:00:00 GMT+09:00 1899, Sat Dec 30 10:00:00 GMT+09:00 1899, 30.0, 30.0, true]]
15:34:08 お知らせ 実行完了
■取得した配列から、開始日、終了日を抜き出す
function getEvents() {
// シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("検索条件");
// メンバーのアドレス一覧を取得
const rows = sheet.getLastRow()-6;
const range = sheet.getRange(7,2,rows,1);
const addresses = range.getValues();
// 検索条件の取得
const conditionsRange = sheet.getRange(7,4,1,7);
const conditions = conditionsRange.getValues();
const startDate = conditions[0][0];
const endDate = conditions[0][1];
Logger.log(startDate)
Logger.log(endDate)
実行ログ
15:35:24 お知らせ 実行開始
15:35:29 情報 Tue Nov 07 00:00:00 GMT+09:00 2023
15:35:29 情報 Thu Nov 09 00:00:00 GMT+09:00 2023
15:35:25 お知らせ 実行完了
■開始時間、終了時間を抜き出す
※スプレッドシートに日付が無い時間の場合は、デフォルトで1899年12月30日が設定されるらしい
※getValuesだと、google側の処理が多くなり良くないので、配列からデータを持ってくるほうが早い
function getEvents() {
// シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("検索条件");
// メンバーのアドレス一覧を取得
const rows = sheet.getLastRow()-6;
const range = sheet.getRange(7,2,rows,1);
const addresses = range.getValues();
// 検索条件の取得
const conditionsRange = sheet.getRange(7,4,1,7);
const conditions = conditionsRange.getValues();
const startDate = conditions[0][0];
const endDate = conditions[0][1];
const startTime = conditions[0][2];
const endTime = conditions[0][3];
Logger.log(startTime);
Logger.log(endTime);
}
実行ログ
15:39:37 お知らせ 実行開始
15:39:41 情報 Sat Dec 30 08:00:00 GMT+09:00 1899
15:39:41 情報 Sat Dec 30 10:00:00 GMT+09:00 1899
15:39:37 お知らせ 実行完了
▼11/7に+1日した日付を取得できる
※例えば、date.setDate(20);とすれば、11/20日のデータが取得できる
※ただ、この取得した日付を変数に格納すると、日付ではなく、数値として保存されるので、その点は注意する
↑つまり、setDateで取得したデータは変数に格納できないイメージになる
function getEvents() {
// シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("検索条件");
// メンバーのアドレス一覧を取得
const rows = sheet.getLastRow()-6;
const range = sheet.getRange(7,2,rows,1);
const addresses = range.getValues();
// 検索条件の取得
const conditionsRange = sheet.getRange(7,4,1,7);
const conditions = conditionsRange.getValues();
const startDate = conditions[0][0];
const endDate = conditions[0][1];
const startTime = conditions[0][2];
const endTime = conditions[0][3];
const interval = conditions[0][4];
const lengthOfTime = conditions[0][5];
const guestFlag = conditions[0][6];
// 日付一覧を取得
const date = new Date(startDate);
// Date変数としてstartDateを転生させて、これで日付データとして、GAS上で認識される
// 転生させないと、数値として情報が取得される
date.setDate(date.getDate()+1);
// setほにゃららは、日付や時間の指定したものに変更するメソッドになっている
// seteDateには変更後の日付を指定する。20と設定したら◯月20日になる
// date.getDate()で+1で取得した日付の次の日のデータを指定することができる
Logger.log(date);
実行ログ
23:50:01 お知らせ 実行開始
23:50:01 情報 Wed Nov 08 00:00:00 GMT+09:00 2023
23:50:02 お知らせ 実行完了