Goole Apps Script (GAS)を触ってみました


Google Apps Script

前置き

みなさん、GASを知っていますでしょうか? GASとは「Google Apps Script」の略でGoogle上で無料で動かせるJavascriptベースの実行環境です。Google Spread Sheet, Google formなどのGoogleが提供しているサービスに連携可能です。
今回はこのGASを使ってGoogle Spread Sheetを連携した話を書きたいと思います。


GASとは

GASとは「Google Apps Script」の略でGoogle上で無料で動かせるJavascriptベースの実行環境です。Google Spread Sheet, Google formなどのGoogleが提供しているサービスに連携可能です。

今回作成したサービスの概要

今回は機材管理をする機能を作ってほしいと相談を受けたので作成しました。
用件としては以下の2点です。

  • 機材がどの状態であるか一目でわかるようにしたい
  • ログが欲しい

作成したコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
function onEdit(e) {
var sheetToWatch = "機材状態"; // 監視するシートの名前
var sheetToPaste = "ログ"; // コピー先のシートの名前
var timeToWait = 0.5; // 編集後、何分間待つか

var range = e.range;
var sheet = range.getSheet();
var row = range.getRow();
var column = range.getColumn();
var editedValue = e.value;
var editor = e.user.getEmail();
var editedTime = new Date();
var now = new Date();

// 編集後、一定時間待ってから処理を続行する
Utilities.sleep(timeToWait * 60 * 1000);

var diffInMillis = now.getTime() - SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetToWatch);

// 監視するシートでない場合は処理を終了する
if (sheet.getName() !== sheetToWatch) {
return;
}

// 編集されたセルが特定の列でない場合は処理を終了する
if (column < 2 || column > 5) {
return;
}

// 編集された行の範囲を取得する
var rowRange = sheet.getRange(row, 1, 1, sheet.getLastColumn());

// 編集された行の値が空である場合は処理を終了する
if (rowRange.isBlank()) {
return;
}

// コピー先のシートを取得する
var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetToPaste);

// 空白の行を検索する
var pasteRow = 1;
while (pasteSheet.getRange(pasteRow, 1).getValue() !== "") {
pasteRow++;
}

// コピー先のセルを取得する
var pasteRange = pasteSheet.getRange(pasteRow, 1, 1, sheet.getLastColumn() + 2);

// コピー先に値を貼り付ける
rowRange.copyTo(pasteRange);

// 編集時間と編集者を追加する
var lastColumn = pasteSheet.getLastColumn();
pasteSheet.getRange(pasteRow, lastColumn - 1).setValue(editor);
pasteSheet.getRange(pasteRow, lastColumn - 0).setValue(editedTime);
}

コードの解説

機能、構成の詳細は以下です。

  • 機材状態シート
    • トリガー: 編集後の保存がトリガーとなる
    • 処理:
      • 編集された行をコピー
      • 30秒経つとプログラム再開
  • ログシート
    • ログの作成:
      • 機材状態シートでコピーされた行をコピー
      • コピーした行に編集者のメールアドレスと編集日時を記入

欠点

欠点はログが1セルが編集されるごとに生成されるため、頻繁に機材を使う場合だとログの量が多くなってしまい、容量を圧迫してしまうかもしれないことです。

終わりに

Javascriptで簡単に無料で実用的な機能を作成できるので、プログラムを書いてみたいという方は触れてみてはいかがでしょうか。