✈️
GAS Tips
このページの目的
Gasを初めて書いた身として、作成にあたりつまづいたところや留意しておきたいことをまとめた。一つの挙動を作っただけであるから、網羅的では全くないことに注意。
忘れると思われる自分、また今後作る人の足がかりになれば。
作ったものは、slackから情報を取得しspread sheetを更新、notionに反映させるもの。
js
function
-
関数。通常(?)の関数として他の関数に組み込むこともできるし、function単位で実行することもできる。(実行方法は多分これだけ)
function(引数){ 操作 return 戻り値 };
-
UI上ではトグルで関数を選択、
実行
で実行される。 -
ローカルからの動かし方もあるらしい https://dev.classmethod.jp/articles/gas-aside/
-
アロー関数(無名関数)
a => a + 100;
- 基本は
引数 ⇒ 戻り値
の形式。応用形が無限にありそう - 引数が二つ以上の場合は()で囲む。
- asyncとかもこれに関わる。よくわかっていない。
- 以下に詳しい。https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions
- 基本は
順序
- function同士の順序は気にしなくていい。子関数(?)は前後どちらでも大丈夫。
- ファイル指定もなくて良い。(多分)
- 変数に関しては使う以前での宣言が必要(後述)
- 変数もglobalで、基本的にファイル間で共用できる。
変数
- 宣言が必要。
- 基本的に宣言したブロック({}で囲まれている範囲)内が参照できるスコープ。
- 関数内に含まれていないものがファイル間参照可能のものとなる。
- 宣言は3種類。参照範囲と使い方で決まり、データタイプ等は関係ない。
- const
- 基本的にこれ。ブロック内参照。
- 再代入・再宣言不可。
- let
- 再代入できる。(更新したい変数にはこれ)
-
vervar- 使っていない。スコープが広いらしい。
- できるだけ var 使わずに、let か const で編集可否を明示する方が良いとされている
- const
命名規則
- 後から調べたため、コード上ではその通りになっていない。。
- 慣例では
- メソッド名や変数名にはlowerCamelCase,
- クラス名にはUpperCamelCase,
- 定数には全て大文字のSNEAK_CASE
- 大文字から始めるとピンクに色付けしてくれる。(上ではUpperCamelCase,SNEAK_CASEがこれに当たる)
スクリプトプロパティ
- 文字列等を別途書きできる場所。トークンやURLなどベタ書きしたくない情報の保存に使う。
-
PropertiesService.getScriptProperties().getProperty(<プロパティ名>)
で取得可能。
コメントアウト
- 1行は
//
- 複数行は
/*, */
で囲む
実行
- 保存してからでないと実行されない。
- 実行ログはデフォルトでは一回分しか参照できない。
その他
-
;
でステートメントの末尾を明確化する- なくても自動判別で動くらしい
- 変数の宣言時には絶対必要そう
- pythonのprint()に当たるのは
console.log(<ここに記述>)
SpreadSheet
アクセス
const spreadsheet = SpreadsheetApp.openByUrl("<シートURL>");
const sheet = spreadsheet.getSheetByName("<シート名>");
-
認証方法はわかっていないが↑でいける。- GAS実行(または実行設定)時に出てくる、誰が認証するねんみたいなダイアログで設定したユーザーの権限が使われる
基本操作
-
読み取り:
Sheetオブジェクト.getRange(<範囲>).getValues()
-
書き込み:
Sheetオブジェクト.getRange(<範囲>).setValues(<入力値>)
-
範囲については以下の’インデックス’を参照。
-
以下によりDataFrameのようなものの取得が可能。
const range = sheet.getDataRange(); const values = range.getValues();
↑で
row = values[0]
とすると1行目がリスト形式で取れ、row[0]
でA1セルが取得できる。
範囲
- セル番号(”A1”)や行番号はそのまま使えるらしい。列名は番号に変換のこと(1スタート)。
- getRange(1,1)がA1に当たる。
- 一方、valuesで取得してる場合には0から数えられるためズレる。
- https://ex-ture.com/blog/2023/02/03/googleスプレッドシートのデータをgasで整理する【getrange編/
Notion
全体を通して厄介。公式ドキュメントの記述形式もなんか違う(ように見える)上にChatGPTも信用できない。またプロパティが多すぎてコードが長い。
構造
- Database > Page > Block
- それぞれにIDがあり、それだけで基本的にアクセスできる。
- URLは上位のIDと組み合わされる。
- それぞれ(膨大かつかなりネスト構造な)プロパティを保持する
アクセス
-
UrlFetchApp.fetch(<URL>, <操作>);
により操作。結果がJSON形式で返ってくる。 -
操作
options = { headers: <header>, method: <method>, payload: <JSON形式のobject> };
で構成。それぞれについては以下で。
header
-
アクセス情報を格納。ほとんど変えなくてOK.
headers: { 'Content-Type': 'application/json', 'Notion-Version': '2022-06-28', 'Authorization': `Bearer ${NOTION_INTEGRATION_TOKEN}` }
NOTION_INTEGRATION_TOKENは発行だけでなくadmin権限での許可が降りていないと操作できない
method
- get, post, patch のいずれか。
- 操作の目的(取得/新規作成/更新)に合わせて。
object
- とにかく膨大。https://developers.notion.com/reference/block
- 本体のプロパティの中に’children’が存在し、オブジェクト格納ができることで、無限ネストが可能になっている。
- type項が革新的。データ型が’number’’text’のみならず’url’や’email’など多岐にわたる。
- rich-text表記のプロパティとtext表記のプロパティ・データ型があるので混同しないように。
ChatGPTの誤解(2024年3月)
- patch
- 既存のページに書き込む操作のmethodは
patch
が正解にも拘らず、post
をずっと推してくる。
- 既存のページに書き込む操作のmethodは
- トグル
-
"is_toggleable": true
でいい。そのようなプロパティはないと言われる。
-
Discussion