🔖

Google Apps Script(GAS) スニペットまとめ

2021/01/29に公開
1

最近 Google Apps Script を触る機会が多いので備忘録がてらまとめてみました.
学んだもの, 便利だなと思ったものは随時追加していこうと思ってます!

みなさんもこんなの便利だよ的な Tips あったらコメントもらえると嬉しいです!!

汎用系

メッセージボックスを表示しよう

Browser.msgBox("ありがとう!");

こんな感じで結果が表示されます.

Confirm を表示しよう

返り値は true/false ではなく 'yes'/'no' で返ってくる点にご注意を!

var result = Browser.msgBox("楽しいですか?", Browser.Buttons.YES_NO);
Browser.msgBox(result === 'yes' ? "良かったです!" : "そうですか... 一緒に楽しみましょう!");

Prompt を表示しよう

入力した文字列が結果として返ってきます.
書いてて思ったんですが cancel って入力したときは入力したかどうかの判定できないですね...

var result = Browser.inputBox("お名前は?", Browser.Buttons.OK_CANCEL);

if (result !== 'cancel') {
  Browser.msgBox(result + 'さん, よろしくね!');
}

UUID を生成しよう

連番ぽくない id 生成したいときなんかに便利!

var uuid = Utilities.getUuid();
console.log(uuid); // 718e3f4d-993f-42a0-9d96-13b95eae7949

スリープしよう

console.log('start');
Utilities.sleep(1000);
console.log('end'); // 1秒後に表示される

スプレッドシート系

アクティブなシートを取得

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

シート名からシートを取得

var sheet = spreadsheet.getSheetByName('シート1');

シートのセルの内容を取得

var value = sheet.getRange('A1').getValue();
console.log(value);

シートのセルの内容をすべて取得

var values = sheet.getDataRange().getValues();
console.log(values); // [[...], [...], ...]

シートのセルにテキストを書き込む

// A1 に Hello, world! を書き込む
sheet.getRange('A1').setValue('Hello, world!');
// 当然式もいける
sheet.getRange('B1').setValue('=SUM(A:A)');

アクティブなセルにテキストを書き込む

sheet.getActiveCell().setValue('Hello, world!');

イベント系

編集時に発火するイベント

/*
 * value ... 値
 * oldValue ... 編集前の値
 * range ... 編集した範囲
 */
function onEdit(e) {
  Browser.msgBox(e.value);
}

GET API

doGet という関数を定義してデプロイすれば外部サービスから API として使うことができます.

function doGet(e) {
  var params = JSON.stringify(e.parameter);
  var output = ContentService.createTextOutput(params);
  output.setMimeType(ContentService.MimeType.JSON);

  return output;
}

POST API

doGet の POST 版

function doPost(e) {
  var body = e.postData.contents;
  var output = ContentService.createTextOutput(body);
  output.setMimeType(ContentService.MimeType.JSON);

  return output;
}

その他

外部 API を叩いてデータを取得

基本 GAS は同期的に処理してくれるので async/await 的なことする必要はありません.

GET

var url = "https://jsonplaceholder.typicode.com/todos/1";
var res = UrlFetchApp.fetch(url);

console.log(res.getContentText()); // { "userId": 1, "id": 1, ... }

POST

var url = "https://apiexample.com/v1/items";
var item = { title: 'Hello, world!' };
var opts = {
  method: 'POST',
  headers: { "Content-Type": 'application/json' },
  payload: JSON.stringify(item),
};

var res = UrlFetchApp.fetch(url, opts);
console.log(res.getContentText());


CSV の内容を JSON にする

若干 GAS とは関係ないですが, よく使うコードです.
CSV 形式でシートを書いていれば一発で JSON(Object の配列) に変換します.

var values = sheet.getDataRange().getValues();
var titles = values.shift();
var data = values.map(v => {
  var obj = {};
  titles.forEach((title, index) => {
    obj[title] = v[index];
  });

  return obj;
});

console.log(data);

こんな感じの CSV が

id,title,description
1,javascript,最高の言語
2,c,ゲーム開発ならこれ
3,go,最近のバックエンド開発のトレンド

こうなります

[
  {
    id: "1",
    title: "javascript",
    description: "最高の言語"
  },
  {
    id: "2",
    title: "c",
    description: "ゲーム開発ならこれ"
  },
  {
    id: "3",
    title: "go",
    description: "最近のバックエンド開発のトレンド"
  }
]

Discussion

hato-codehato-code

Google Driveでのファイル操作も追記してほしいです!