基本文法以外のgoogle apps scriptの特有の関数などについて.

google apps script (のうちのspreadsheet系) 主要概念.

この4つの概念の理解が肝.この4つの階層構造理解したらあとは関数とかそのたびに調べられるようになると思う.

最後に例といっしょに説明も入れておく.

  • SpreadsheetApp: googleが提供するスプレッドシートのアプリオブジェクト.デフォルトでこのオブジェクトの変数は最初から使用可能.
  • Spreadsheet: 授業管理シートのような1つのファイル概念.SpreadsheetAppから取得することが多い.
  • Sheet: Spreadsheet内の1枚のシート概念.Spreadsheetオブジェクトから取得してくることが多い.
  • Range: Sheet内の複数もしくは単一セルの概念.Sheetオブジェクトから取得してくることが多い.

また,'Active'という表現でいきなり,SpreadsheetAppからもっとRangeオブジェクトを取得したりすることも多い.

f:id:tna-teachers:20180828171922p:plain

よく使う関数の流れ

SpreadsheetApp -> Spreadsheetオブジェクトの取得

SpreadsheetAppという変数は既存で用意されているのでいきなりあるものとしてコード内で使用できる.

ss = SpreadsheetApp.getActiveSpreadsheet()
  • そのスクリプトが紐付けられている(Activeな)Spreadsheetを自動的に取得.

授業管理シートに紐付いているスクリプトでこの関数を使用すれば「授業管理シート」というSpreadsheetオブジェクトを取得することになる.

ss= SpreadsheetApp.openById('~~~~')
  • ファイル固有のidからSpreadsheetを取得.

ファイル固有のidは https://docs.google.com/spreadsheets/d/1YEsETCQeY30uDvgzc0xFP2ZgMOPrdAwpalm_UsNSihs/edit#gid=70051544っていうURLがあるとしたら, 1YEsETCQeY30uDvgzc0xFP2ZgMOPrdAwpalm_UsNSihsっていうdのうしろにあるやつ.

補足

上のようにSpreadsheetApp.getActiveSpreadsheet()とかみたいに,「. (ドット)」で繋がれているものはその前のオブジェクトに属する関数.という感じ.

getActiveSpreadsheet()という関数は「Spreadsheetオブジェクトを取得するための,SpreadsheetAppオブジェクトに属する関数」であって,それによって返ってくるSpreadsheetオブジェクトを ssという変数に代入している. ssは要するに取得されたSpreadsheetオブジェクト.(授業管理シートオブジェクトであることが多い)

Spreadsheet -> Sheetオブジェクトの取得

ssってのは上で取得した何らかのSpreadsheetオブジェクト. そこから中身のシートとかを取得できる.

sheet = ss.getSheetByName('~~~')
  • シートの名前からSheetオブジェクトを取得.

'8月'とか,特定のSheetオブジェクトを取ってくる.

sheets = ss.getSheets()
  • シートをすべて取得.SheetオブジェクトのリストがSpreadsheet内の順番通りに得られる.配列と同じようにそれぞれにアクセス.

sheets[0], sheets[1]とかがそれぞれSheetオブジェクトとなる.

Sheet -> Rangeを取得

取得後,そのRangeから値を取得したりそのRangeに値をセットしたり色を付けたり.複数セルのときもあれば単一セルのときもあれば.

range = sheet.getRange(row, column, numRows, numColumns)

values = range.getValues()
color = range.getBackground() 
range.setValues(セットしたい値)
range.setBackground(セットしたい色)
range.setFontColor(セットしたい色)

Tutorial

コードを自分で読むための関数の調べ方などのデモ.

上に書いたのは基本的な関数だけど,この階層構造を知ってたら,どのレベルのオブジェクトに属する関数か理解できるので,そのオブジェクトを調べればそこに該当の関数があるはず.なければ多分何かを読み間違えてる.んで説明がサイトに載ってるからそれを調べればコードは読めると思う.

リンク:

簡単なコードの例として休講をセッティングするためだけのコードとともに.以下,現時点でのそのままのコピペ.

function setKyuukou() {
  setStatus('休講')
}

function setCancel() {
  setStatus('直前キャンセル')
}

function setStatus(status){
  // status = '休講' or '直前キャンセル', 複数行対応
  var activeRange = SpreadsheetApp.getActiveRange()
  var rowIndex = activeRange.getRowIndex()
  var height = activeRange.getHeight()
  
  for(var i=0; i<height; i++){
    var curIndex = rowIndex+i
    var class_id = SpreadsheetApp.getActiveSheet().getRange(curIndex, 1).getValue()
    var ui = SpreadsheetApp.getUi()
    var confirm = ui.alert('授業idが'+String(class_id)+'の授業を'+status+'とします.よろしいですか?', ui.ButtonSet.OK_CANCEL)
    if(confirm == ui.Button.OK){
      SpreadsheetApp.getActiveSheet().getRange(curIndex, 8, 1, 1).setValue('休講')
      SpreadsheetApp.getActiveSheet().getRange(curIndex, 9, 1, 1).setValue(status)
    }
  }
}
var activeRange = SpreadsheetApp.getActiveRange()

SpreadsheetAppから取得しているからSpreadsheetオブジェクト,とはならない.この関数を調べてみる.(自分でも上記リンクから調べてみて.)

SpreadsheetAppオブジェクトに繋がれている関数なので,SpreadsheetAppのページからgetActiveRange()という関数を調べる.(command+Fとかやるといいよ)

すると見つかるはず.

f:id:tna-teachers:20180828173042p:plain

まず,Return (返り値のこと) のところに Rangeとかいてある.この関数によって返ってくるのは Rangeオブジェクト.

サイト内の具体例ではその後そのRangeの背景色を取得する関数をそのまま続けている.

ちなみにActiveなRangeとは選択中のセルのこと.休講セッティング関数は休講にしたい行にいた状態で使うというものになっていたはず.ここから来てる.

var rowIndex = activeRange.getRowIndex()

2行目.activeRangeは1行目で代入したRangeオブジェクト.(おそらく名前的にその行の番号を取得するのはわかるだろうが.) 

getRowIndex()関数はRangeオブジェクトに属する関数であることが判断できるので Rangeのページから getRowIndex()という関数を調べる.見つかるはず.

f:id:tna-teachers:20180828173924p:plain

ReturnはInteger.普通にjavascriptの数値が返ってくる.まぁ想像通りRangeの行番号が返ってくる.

他にはgetRow()関数と同じと書いてあったり.(どちらを使用してもいいけど可読性の高いgetRowIndex()を使って書いた)

こんな感じで調べるといいと思う.一応練習用に続きの解説.

  var height = activeRange.getHeight() 

rangeから高さを取得して,その高さ分のfor文を回す.

  for(var i=0; i<height; i++){
    var curIndex = rowIndex+i

セルの行番号に iを足して行番号を順番に取得して,

    var class_id = SpreadsheetApp.getActiveSheet().getRange(curIndex, 1).getValue()

その行番号の行の1列目(授業idのはいってる列)のRangeを取得して中の値を取得して,

    var ui = SpreadsheetApp.getUi()
    var confirm = ui.alert('授業idが'+String(class_id)+'の授業を'+status+'とします.よろしいですか?', ui.ButtonSet.OK_CANCEL)

休講にしちゃうけどいいかみたいな確認とって,OKなら,休講/直前キャンセルを該当の場所に取得しちゃう.

    if(confirm == ui.Button.OK){
      SpreadsheetApp.getActiveSheet().getRange(curIndex, 8).setValue('休講')
      SpreadsheetApp.getActiveSheet().getRange(curIndex, 9).setValue(status)
    }
  }
}