Open2

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

HubHub

階層構造について

  • 階層構造が操作対象になる。
    • 操作対象のことをクラスと呼ぶ(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丸々指定する
  • 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	お知らせ	実行完了
    

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	お知らせ	実行完了
HubHub

データの行数を自動で算出したい

考え方は、「データが入っている最後の行番号」から「不要な行数」を引いた値になるはず
不要な行数は普遍のはずなので、データが入っている最後の行数を取得する

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	お知らせ	実行完了
■開始時間、終了時間を抜き出す
※スプレッドシートに日付が無い時間の場合は、デフォルトで18991230日が設定されるらしい
※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	お知らせ	実行完了