それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Goole App Script ( GAS ) の基本的な操作方法。 16. 専用サイトでGASプロジェクトを管理する。

GAS は Google drive

GASの一覧と管理は、Google Driveで行うのが基本になるみたいですね。

Google Driveのフォルダに、プロジェクトが作成される。

プロジェクトは固有IDを持ち、好きなフォルダに設置することができる。スプレッドシートからスクリプトエディタを開いたときは、スプレッドシートと同じフォルダに設置される。

スクリプトが増えてくると、スクリプトシートと紐付いているのを無視して管理したくなる。そのときに便利なのがプロジェクトを一覧するサイト。

google app script は次のサイトで一覧できる。

GASのプロジェクトファイルは、次のサイトでDriveに四散しているプロジェクトファイルを見ることができる。

https://script.google.com/home

自分のプロジェクトの一覧を見ることができる。

f:id:takuya_1st:20210607211718p:plain

タイマーの一覧も見れる。

トリガーで作ったタイマーも、プロジェクトを横断して確認できる。

f:id:takuya_1st:20210607212231p:plain

https://script.google.com/home でプロジェクト単体として存在できる。

https://script.google.com/homeで管理するのはプロジェクト単体な、プロジェクトである。スプレッドシートやスライドと紐付かず、独立したプロジェクトとしても作成できる。

ドキュメントから独立したプロジェクトの魅力

単体プロジェクトは、ドキュメントとペアにせず、単独のプロジェクトとして、作成管理できる。

そのため、テンプレートから新規ファイルを作るプロジェクトや、結果を新規ドキュメントに保存するようなプロジェクトを作成して管理しやすくなって便利ですね。

Goole App Script ( GAS ) の基本的な操作方法。15. GAS をスケジュールで実行する

GAS の実行方法の種類

GASを実行するには、いくつか方法があって、ボタンを押して実行、メニューから実行、実行ボタンを押す、HTMLで実行、スケジュールで実行、APIで実行がある。

分類すると次のようになる。

  • ドキュメント内イベントハンドラで実行
    • ボタンを押す
    • 開く・編集で実行
    • メニューから実行
  • HTML を使う。
    • HTMLを表示で実行
    • フォーム送信で実行
  • 単体で実行
    • タイマーで実行
    • APIで実行

今回は、タイマーで実行する方法を見ておく。

GoogleAppScript をタイマー実行する

GASはスケジュールで実行の設定ができる。スケジュール実行は、とてもかんたん。

トリガーを作る

スクリプトメニューから、トリガーを選択

f:id:takuya_1st:20210607150639p:plain

トリガーを追加

時刻でトリガーを追加する。

実行する関数と、実行する時間・日付をきめてトリガーを作成すればオッケ。

f:id:takuya_1st:20210607150620p:plain

便利ですね。

追加費用もなしで、スクリプトをタイマーで実行できるのはいいですね。

レンタルサーバーなどではcrontab などが必要で実行数が規制されたりするし、crontab/systemd を使うと設定に知識が必要なのに、GASは本当にかんたんに実行できる。

Goole App Script ( GAS ) の基本的な操作方法。14.スプレッドシートに追記する。

スプレッドシートに追記したい。

スプレッドシートのデータの範囲に、次の行を書くにはどうするのか。同じデータを連続して書き込むにはどうするのか。少し考えてみた。

セルに続けて書きたい。

セルの最終行に次行のレコードを書き込んでログのように記録を取りたい

次のように、続けて書き込みたい。

f:id:takuya_1st:20210605022853p:plain:w200

GASの例

function main(){
  addCell();
}
function addCell() {
  let app = SpreadsheetApp.getActiveSpreadsheet();
  let sh = app.getActiveSheet();
  let range = sh.getDataRange();
  let r = range.getLastRow();
  let c = range.getLastColumn();
  let nextCell = sh.getRange(range.getLastRow()+1,1,1,2);
  let data = [
    [getCurrentIp(),currentDateTime()]
  ]
  nextCell.setValues(data)

}
// データ
function getCurrentIp() {
  let ip = 'x.x.x.x'
  let url = 'https://api.ipify.org?format=json'
  let json = UrlFetchApp.fetch(url);
  let obj = JSON.parse(json);
  //ip = (obj) ? obj.ip : ip;
  return ip;
}
function currentDateTime(){
  let d = new Date()
  let str = Utilities.formatDate(d, 'Asia/Tokyo','yyyy/MM/dd HH:mm:ss')
  return str;
}

実行すると。

最初、空っぽの状態から、データがログのように書き込まれる。
f:id:takuya_1st:20210605021733p:plain:w200

f:id:takuya_1st:20210605021815p:plain:w200

コードについて。

今回使ったコードの冒頭部分について。

現在データが書き込まれている範囲を取る。

getDataRange は、CTRL-Aで選択して自動的に作られる選択範囲を取得する。

  let app = SpreadsheetApp.getActiveSpreadsheet();
  let sh = app.getActiveSheet();
  let range = sh.getDataRange();
  let r = range.getLastRow();
  let c = range.getLastColumn();

次の行の範囲を取る。

次の行を選ぶのでgetLastRow()+1 を使う。列は先頭からなので、1を入れる。(プログラミングになれた人は、ここで配列と同じ入れがちなので注意、セルは1から数えます。)

sh.getRange(range.getLastRow()+1,1,1,2);

getRange は矩形選択、Rectangleの描画と同じ

getRange は1,2引数で選択開始位置。(開始座標)
getRange は3,4引数で選択する個数。(縦横長さ)

getRange( startRow, StartCol, numOfRow, numOfCol) 

選択範囲にデータを貼り付け

選択範囲にデータを貼り付けするのは setValues を使う。

setValues([  [ COL_A, COL_B ]  ] )

setValue の引数は、ネストした多次元配列。

多次元配列には、行ごとにデータを入れる。

data = [
 [ "A1", "B2" ] //  1行目
 [ "A2", "B2" ] //  2行目
]

データの追記はよくやるので

データ追記はよくやるので、ぱぱっとできるといいな。

2021-06-07 追記

似たような方法に次のような方法がある。 getLastRow 関数を利用する。

getLastRow はデータ領域の最終行が返されるので、不定数のカラムを書き込むのであれば、getLastRowもいいと思う。

この記事では、行の下方向に決まったデータを追記するので、getDataRange() を使ってます。

getLastRow は次のペアで覚えておくと便利です。

sheet.getLastRow();
sheet.getLastColumn();