手軽に自動化の力を手に入れよう:Google Apps Script入門

目次

Google Apps Scriptの概要

Google Apps Scriptとは

Google Apps Script(通称GAS)は、Googleが提供するクラウド上で動作するプログラミング環境のことを指します。このGASを使うと、Googleの各種サービス(例えば、Gmail、Googleドキュメント、Googleシート、Googleカレンダー、Googleドライブなど)を連携させて、自動化した作業や新しい機能を作り出すことができます。

Google Apps Scriptのメリット

GAS は、Google Workspace をより効率的に使用するために、とても便利なツールです。
GAS を使用すると、自動化タスクや機能を作成して、手作業を省いたり、時間を節約したりすることができます。
また、GAS を使用すると、Google Workspace をカスタマイズして、自分のニーズに合わせて機能を拡張することができます。

  • 学習コストが低
  • 開発環境の構築が不要
  • Google サービスとの連携が簡単
  • スクリプトの実行が自動化できる

Google Apps Scriptの使い方

  1. Google Workspace のアプリを開きます。
  2. メニューバーの「ツール」から「スクリプトエディター」を選択します。
  3. スクリプトエディターが開いたら、新しいスクリプトを作成します。
  4. スクリプトエディターで、GAS コードを入力します。
  5. スクリプトを実行します。

コンテナバインドスクリプトとスタンドアロンスクリプト

コンテナバインドスクリプトとスタンドアロンスクリプトのどちらを使用するかは、スクリプトの目的によって異なります。アプリケーションに関連付けられたデータや機能を利用したい場合は、コンテナバインドスクリプトを使用することをお勧めします。より自由にスクリプトを作成したい場合は、スタンドアロンスクリプトを使用することをお勧めします。

スタンドアロンスクリプト

スタンドアロンスクリプトは、Google Workspace のアプリケーションに関連付けられていないスクリプトです。スタンドアロンスクリプトは、アプリケーションに関連付けられたデータや機能を利用することはできませんが、より自由にスクリプトを作成することができます。

コンテナバインドスクリプト

コンテナバインドスクリプトは、Google Workspace のアプリケーション(スプレッドシート、ドキュメント、スライドなど)に関連付けられたスクリプトです。コンテナバインドスクリプトは、アプリケーションに関連付けられたデータや機能を利用することができます。

Google Apps Scriptの基本

変数と定数

変数とは

変数は、プログラム処理を利用するデータを格納しておく入れ物です。
格納されるデータは、文字、数字、アンダースコアで構成できます。
値は、文字列、数値、配列、オブジェクト、関数など、さまざまな型のデータを保存できます。

変数を使用すると、プログラムの処理を簡潔にしたり、繰り返し処理を効率化したりすることができます。
また、変数を使用すると、プログラムの実行中に値を変更したり、値を比較したりすることができます。

変数を使用する際には、変数名をわかりやすく、一貫して使用することが重要です。
また、変数に格納するデータの型を正しく指定することも重要です。

let 変数名 = 値;

たとえば、変数名を「myVar」として、値を「10」として変数を宣言するには、次のコードを使用します。

function myFunction() {
  let myVar = 10;
}

変数を宣言したら、変数値を変更したり、変数値を使用したりできます。
変数値を変更するには、変数名に新しい値を割り当てます。値を「20」に変更するには、次のコードを使用します。

function myFunction() {
  let myVar = 10;
  myVar = 20;
}

変数値を確認するには、次のコードを使用します。

function myFunction() {
  let myVar = 10;
  myVar = 20;
  Logger.log(myVar);
}

文字列を扱う場合は、ダブルクォーテーション(”)またはシングルクォーテーション(’)を使用します。

function myFunction() {
  let myName = "篠原和樹";
  Logger.log(myName);
}

定数とは

変数と似た使い方をするものに「定数」も存在します。
変数は、プログラムの途中で格納されているデータを変更できます。
一方、定数は、一度データを設定するとその後は変更することができません。
つまり、定数は、値を変更してはいけない場合に使用されます。

定数は、「const」キーワードを使用します。
変数名を「myConst」として、値を「10」として定数を宣言するには、次のコードを使用します。

function myFunction() {
  const myConst = 10;
}

定数を宣言したら、変数値を変更しようとすると、エラーが発生します。
たとえば、次のコードを実行すると、エラーが発生します。

function myFunction() {
  const myConst = 10;
  myConst = 20;
}

よく使う変数宣言

var: グローバル変数

ローカル変数を宣言するために使用されます。
ローカル変数は、宣言された関数スコープ内のみ有効です。

let: ローカル変数

ブロックスコープで変数を宣言するために使用されます。
ブロックスコープとは、関数の一部であるコードのブロックです。

const: 定数変数

定数変数は、値を変更できません。

varとletの使い分け

varletは、両方とも変数を宣言するためのキーワードですが、スコープ(変数が存在する範囲)と再宣言の規則が異なります。

スコープ
  • varは関数スコープを持ちます。つまり、varで宣言された変数は、それが宣言された関数内でのみ利用できます。また、varで宣言された変数は、宣言されたブロック(if文やforループ等)の外でも利用できます。
  • letはブロックスコープを持ちます。それは、letで宣言された変数は、それが宣言されたブロック(及びそのサブブロック)内でのみ利用できるということです。
再宣言
  • varは同じスコープ内で同じ名前の変数を再宣言できます。
  • letは同じスコープ内で同じ名前の変数を再宣言できません。再宣言しようとするとエラーが発生します。
function varTest() {
  var x = 1;
  if (true) {
    var x = 2; // 同じ変数!
    console.log(x); // 2
  }
  console.log(x); // 2
}

function letTest() {
  let x = 1;
  if (true) {
    let x = 2; // 異なる変数
    console.log(x); // 2
  }
  console.log(x); // 1
}

変数の命名コツ

  • 大文字と小文字は区別される
  • 数字、一部(_,$)を除いた記号は先頭の文字に使用できない
  • 予約語は使用できない
    一覧)and, as, break, case, catch, class, const, continue, default, do, else, enum, export, extends, false, finally, for, function, if, implements, import, in, instanceof, interface, let, new, null, package, private, protected, public, return, static, switch, this, throw, true, try, typeof, var, void, while, with, yield

四則演算

var num1 = 10;
var num2 = 20;
  • 加算(足し算) (+)
var sum = num1 + num2;
30
  • 減算 (引き算)(-)
var sum =  num2 - num1;
10
  • 乗算 (かけ算)(*)
var sum = num1 * num2;
200
  • 除算(わり算) (/)
var sum = num2 / num1;
2
  • 剰余 (余り)(%)
var sum = num2 % num1;
0

条件文

条件文とは、ある条件が成立するかどうかによって、異なる処理を行うプログラミング言語の文です。条件文は、if文とswitch文の2種類があります。

if文

if文は、最も基本的な条件文です。
if文は、条件が成立する場合と不成立の場合で、異なる処理を行うことができます。if文の構文は、次のとおりです。

if (条件) {
  // 条件が成立する場合の処理
} else {
  // 条件が不成立の場合の処理
}

switch文

switch文は、if文よりも複雑な条件文です。
switch文は、条件が特定の値と一致する場合に、異なる処理を行うことができます。switch文の構文は、次のとおりです。

switch (変数) {
  case 値1:
    // 変数が値1と一致する場合の処理
    break;
  case 値2:
    // 変数が値2と一致する場合の処理
    break;
  // ...
  default:
    // 変数が値1、値2、...と一致しない場合の処理
}

比較演算子

==等価左と右が等しい
===同一性左と右が等しく、型も同じ、型変換を行いません
!=不等価左と右が等しくない
<小なり左が右より小さい
<=小なりイコール左が右より小さい、または等しい
>大なり左が右より大きい
>=大なりイコール左が右より大きい、または等しい

ループ処理

ループ処理は、for文とwhile文の2種類のループ処理があり、特定の処理を繰り返し実行するためのものです。

for文

for文を使って、1から10までの数字を表示するコードは次のようになります。

function printNumbers() {
  for (var i = 1; i <= 10; i++) {
    Logger.log(i);
  }
}

while文

while文を使って、1から10までの数字の合計を計算するコードは次のようになります。

var sum = 0;
  var i = 1;
  while (i <= 10) {
    sum += i;
    i++;
  }
  return sum;

配列

配列とは、変数と同様にデータを格納するためのデータ構造です。ただし、通常の変数との主な違いは、配列が一つではなく複数のデータを格納できる点です。関連するデータ群を配列としてまとめて格納することで、データの管理や操作がより分かりやすく、効率的に行えます。

変数の場合は、

var sunday = "日";
var monday = "月";
var tuesday = "火";
var wednesday = "水";
var thursday = "木";
var friday = "金";
var saturday = "土";

配列の場合は、

var week = ["日", "月", "火", "水", "木", "金", "土"];

このように配列を利用すると、関連のある複数のデータをまとめて格納する事が出来ます。

連想配列


連想配列は、一般的な配列と同様にデータを格納するためのデータ構造です。しかし、通常の配列との主な違いは、連想配列がインデックスではなくキーを使用してデータを参照する点です。各データはユニークなキーに関連付けられ、そのキーを使用してデータにアクセスします。この特性により、キーと値のペアを表現する際に非常に便利であり、データの管理や操作をより直感的に行うことができます。

var scores[40, 30, 50, 70, 90];
var scores = {
  "英語": 40,
  "数学": 30,
  "国語": 50,
  "理科": 70,
  "社会": 90
};

関数

GAS の関数の基本的な構文は、次のとおりです。

function 関数名(引数) {
  // 処理内容
}

関数名 は、関数の名前です。引数は、関数に渡される引数です。処理内容 は、関数が実行する処理です

GASでよく使われる関数


Google Apps Scriptでは、Googleが提供しているビルドイン関数が利用できます。
これらはGoogle Workspaceの各種サービスを操作するための多くの組み込み関数で、公式ドキュメントで詳細を確認することができます。以下に、特に頻繁に使用されるいくつかの関数やメソッドを紹介します。

GmailApp.sendEmail()

GmailApp.sendEmail()関数は、Google Apps Scriptを使用してメールを送信するメソッドです。このメソッドは、次の引数を取ります。

  • address: メールを送信する相手のメールアドレス。
  • subject: メールの件名。
  • body: メールの本文。
  • attachments: メールに添付するファイル。
GmailApp.sendEmail(address, subject, body, attachments);

GmailApp.sendEmail(
  'to@example.com',
  'メールの件名',
  'メールの本文',
  ['ファイル2.docx']
);

このメソッドを使用すると、Google Apps Scriptを使用して簡単にメールを送信することができます。

SpreadsheetApp.getActiveSpreadsheet()

SpreadsheetApp.getActiveSpreadsheet()は、Google Apps Scriptでアクティブなスプレッドシートを取得するメソッドです。このメソッドは、スプレッドシートオブジェクトを返します。スプレッドシートオブジェクトを使用して、スプレッドシートのシート、セル、データなどを操作することができます。

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();

このメソッドを使用すると、Google Apps Scriptで簡単にアクティブなスプレッドシートを取得することができます。

range.setValue() and range.getValue()

range.setValue()range.getValue()は、、Google Apps Scriptでスプレッドシートのセルの値を設定したり取得したりするメソッドです。

  • range.setValue()は、指定した範囲のセルの値を設定します。
  • range.getValue()は、指定した範囲のセルの値を取得します。
// 範囲のセルの値を設定します。
var range = sheet.getRange('A1');
range.setValue('値');

// 範囲のセルの値を取得します。
var value = range.getValue();

これらのメソッドを使用すると、Google Apps Scriptで簡単にスプレッドシートのセルの値を設定したり取得したりすることができます。

UrlFetchApp.fetch()

UrlFetchApp.fetch()、Google Apps ScriptでURLからデータを取得するメソッドです。
このメソッドは、HTTPResponseオブジェクトを返します。HTTPResponseオブジェクトを使用して、HTTPレスポンスのステータスコード、ヘッダー、ボディなどを取得することができます。

var response = UrlFetchApp.fetch('https://example.com');
var status = response.getStatusCode();
var headers = response.getHeaders();
var body = response.getBody();

このメソッドを使用すると、Google Apps Scriptで簡単にURLからデータを取得することができます。

CalendarApp.createEvent()

CalendarApp.createEvent()Google Apps Scriptでカレンダーにイベントを作成するためのメソッドです。
このメソッドは、Eventオブジェクトを返します。
Eventオブジェクトを使用して、イベントのタイトル、開始時間、終了時間、場所、招待者などを設定することができます。

var event = CalendarApp.createEvent();
event.setTitle('イベントのタイトル');
event.setStart(new Date());
event.setEnd(new Date());
event.setLocation('イベントの場所');
event.setAttendees(['招待者1', '招待者2']);
CalendarApp.insertEvent(event);

このコードを使用すると、タイトルが「イベントのタイトル」、開始時間が現在の時刻、終了時間が現在の時刻+1時間、場所が「イベントの場所」、招待者が「招待者1」と「招待者2」のイベントを作成することができます。

このメソッドは、Google Apps Scriptでカレンダーを操作する際によく使用されます。たとえば、カレンダーにイベントを作成したり、カレンダーからイベントを削除したり、カレンダーのイベントを変更したりするために使用できます。

これらはあくまで一部の関数にすぎません。GASでは、Googleドキュメントの操作、Googleフォームの操作、Googleドライブの操作、さらにはGoogleマップやGoogleアナリティクスの操作など、様々なサービスに対応した関数が提供されています。これらの関数を組み合わせて使用することで、非常に複雑なタスクを自動化することが可能です。

自作関数を作る

  • 関数の名前を決めます。
  • 関数の引数を決めます。
  • 関数の戻り値を決めます。
  • 関数の処理内容を記述します。
  • 関数を保存します。

関数の例を次に示します。

function sum(x, y) {
  return x + y;
}
var result = sum(1, 2);

このコードを実行すると、結果は「3」になります。

function createArray(length) {
  var array = [];
  for (var i = 0; i < length; i++) {
    array.push(i);
  }
  return array;
}

この関数は、配列の長さを指定すると、指定した長さの配列を返します。

自作関数は、複雑な処理を簡単に記述したり、繰り返し使用する処理をまとめたりするために役立ちます。

Google Apps Scriptの応用

スプレッドシートの操作

スプレッドシートの操作~基礎~

新しいシートを作成する
function createNewSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.insertSheet('New Sheet');
}
スプレッドシートの特定のセルに値を設定する
function setCellValue() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0]; // 1番目のシートを取得する
  var range = sheet.getRange("A1"); // A1セルを選択する
  range.setValue("Hello, world!"); // A1セルに "Hello, world!"と入力する
}
スプレッドシートの全ての値をロギングする
function logSpreadsheetValues() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0]; // 1番目のシートを取得する
  var range = sheet.getDataRange(); // シートのデータ範囲を取得する
  var values = range.getValues(); // シートの全ての値を取得する

  for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[i].length; j++) {
      Logger.log(values[i][j]); // 値をロギングする
    }
  }
}

これらの関数は、Googleスクリプトエディタから直接実行するか、またはスプレッドシート内の特定のイベント(例:オープン、編集、新しいシートの追加など)に応じてトリガーを設定して自動実行することができます。

このスクリプトはとても基本的なものなので、より複雑な操作や特定のニーズに対応するには、より詳細なコードの書き方を理解する必要があります。Google Apps Scriptのドキュメンテーションやチュートリアルを参照することをお勧めします。

スプレッドシートの操作~応用~

スプレッドシート内のデータに基づいて一括でメールを送信する
function sendEmails() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Emails'); // 'Emails'という名前のシートを取得する
  var range = sheet.getDataRange(); // シートのデータ範囲を取得する
  var values = range.getValues(); // シートの全ての値を取得する

  for (var i = 1; i < values.length; i++) {
    var row = values[i];
    var email = row[0]; // 1st column
    var subject = row[1]; // 2nd column
    var body = row[2]; // 3rd column

    MailApp.sendEmail(email, subject, body);
  }
}

このスクリプトは、名前が”Emails”のシートからデータを取得し、各行からメールアドレス、件名、本文を取得し、それを使用して一連のメールを送信します。

指定した範囲のセルに数式を設定する
function setFormulas() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0]; // 1番目のシートを取得する
  var range = sheet.getRange("B2:B100"); // B2からB100までの範囲を選択する
  range.setFormula("=A2*2"); // 各セルに数式 "=A2*2" を設定する
}

このスクリプトは、指定した範囲のセルに同じ数式を設定します。この例では、”=A2*2″という数式を”B2:B100″の範囲のセルすべてに設定しています。

ドキュメントの操作

ドキュメントの操作~基礎~

ドキュメントの新規作成とテキストの追加
function createDocAndAddText() {
  var doc = DocumentApp.create('New Document'); // 'New Document'という名前の新規ドキュメントを作成
  var body = doc.getBody(); // ドキュメントのボディ部分を取得
  body.appendParagraph('Hello, world!'); // テキスト(パラグラフ)の追加
}
既存ドキュメント内の特定のテキストを置換
function replaceText() {
  var doc = DocumentApp.openById('your-document-id'); // 特定のドキュメントIDでドキュメントを開く
  var body = doc.getBody(); // ドキュメントのボディ部分を取得
  body.replaceText('Old text', 'New text'); // 'Old text'を'New text'に置換
}
ドキュメントをPDFとしてGoogleドライブに保存
function saveAsPDF() {
  var doc = DocumentApp.openById('your-document-id'); // 特定のドキュメントIDでドキュメントを開く
  var blob = doc.getBlob(); // Blob形式でドキュメントを取得
  blob.setName(doc.getName() + ".pdf"); // ファイル名の設定(元の名前に.pdfを追加)
  DriveApp.createFile(blob); // GoogleドライブにPDFとして保存
}

各関数でyour-document-idを実際の操作したいGoogleドキュメントのIDに置き換えてください。ドキュメントIDは、ドキュメントのURLの中に含まれています。例えば、https://docs.google.com/document/d/1A2B3C/editというURLのドキュメントの場合、1A2B3CがドキュメントIDです。

注意: Google Apps Scriptを使用する前に、スクリプトが必要とする権限(Googleドライブの読み書き権限など)をユーザーから得る必要があります。これは初回のスクリプト実行時に自動的にプロンプトとして表示されます。

ドキュメントの操作~応用~

テンプレートを使用してカスタマイズされたドキュメントを自動生成
function createCustomDocument() {
  var templateId = 'your-template-id'; // テンプレートのドキュメントID
  var folderId = 'your-folder-id'; // ドキュメントを保存するフォルダのID

  // テンプレートをコピーして新しいドキュメントを作成
  var template = DriveApp.getFileById(templateId);
  var newDoc = template.makeCopy('New Document', DriveApp.getFolderById(folderId));
  var newDocId = newDoc.getId();

  // 新しいドキュメントを開き、テキストを置換
  var doc = DocumentApp.openById(newDocId);
  var body = doc.getBody();
  body.replaceText('{Company}', 'Your Company Name');
  body.replaceText('{Address}', 'Your Company Address');
  body.replaceText('{Date}', Utilities.formatDate(new Date(), 'GMT', 'yyyy-MM-dd'));
  
  doc.saveAndClose();
}

このスクリプトは、指定したテンプレートをコピーして新しいドキュメントを作成し、その中のプレースホルダーのテキストを特定の文字列に置換します。

スプレッドシートのデータを使用して一括でドキュメントを生成
function createDocumentsFromSpreadsheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0]; // 1番目のシートを取得
  var data = sheet.getDataRange().getValues(); // シートの全てのデータを取得
  var templateId = 'your-template-id'; // テンプレートのドキュメントID
  var folderId = 'your-folder-id'; // ドキュメントを保存するフォルダのID

  for (var i = 1; i < data.length; i++) {
    var row = data[i];
    var companyName = row[0]; // 1st column
    var companyAddress = row[1]; // 2nd column

    // テンプレートをコピーして新しいドキュメントを作成
    var template = DriveApp.getFileById(templateId);
    var newDoc = template.makeCopy(companyName + ' Document', DriveApp.getFolderById(folderId));
    var newDocId = newDoc.getId();

    // 新しいドキュメントを開き、テキストを置換
    var doc = DocumentApp.openById(newDocId);
    var body = doc.getBody();
    body.replaceText('{Company}', companyName);
    body.replaceText('{Address}', companyAddress);
    body.replaceText('{Date}', Utilities.formatDate(new Date(), 'GMT', 'yyyy-MM-dd'));
  
    doc.saveAndClose();
  }
}

このスクリプトは、スプレッドシートの各行のデータを使用して一連のドキュメントを生成します。各ドキュメントはテンプレートをコピーして作成され、特定のプレースホルダーのテキストがスプレッドシートのデータで置換されます。

上記のスクリプトでは、your-template-idyour-folder-idは適切なドキュメントIDとフォルダIDに置き換えて使用してください。

Gmailの操作

Gmailの操作~基礎~

メールを送信する
function sendEmail() {
  MailApp.sendEmail({
    to: "recipient@example.com",
    subject: "Hello from Google Apps Script",
    body: "This is a test email."
  });
}
受信トレイから未読メールを取得する
function getUnreadEmails() {
  var threads = GmailApp.getInboxThreads();
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      if (messages[j].isUnread()) {
        Logger.log("Subject: " + messages[j].getSubject());
      }
    }
  }
}

特定の件名を持つメールにラベルを付ける

function labelEmailsWithSubject() {
  var threads = GmailApp.search('subject:("Important Subject")');
  var label = GmailApp.createLabel('Important');
  for (var i = 0; i < threads.length; i++) {
    threads[i].addLabel(label);
  }
}

上記のスクリプトは、”Important Subject”という件名を持つメール全てを検索し、それらに”Important”というラベルを付けます。ラベルがまだ存在しない場合は新しく作成します。

これらのスクリプトは基本的な例であり、Google Apps ScriptでGmailを操作する際の出発点となります。詳細な要件に応じてこれらのスクリプトをカスタマイズしたり、公式のGoogle Apps Script Gmail Service ドキュメンテーションを参照したりしてください。

Gmailの操作~応用~

メールに添付されたファイルをGoogleドライブに自動保存
function saveAttachmentsToDrive() {
  var label = GmailApp.getUserLabelByName("AttachmentsToSave"); // 特定のラベルのメールだけに対象にする
  var threads = label.getThreads();
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var attachments = messages[j].getAttachments();
      for (var k = 0; k < attachments.length; k++) {
        DriveApp.createFile(attachments[k]);
      }
    }
  }
}
未読メールの一覧をスプレッドシートに出力
function listUnreadEmailsInSpreadsheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var threads = GmailApp.getInboxThreads();
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      if (messages[j].isUnread()) {
        sheet.appendRow([messages[j].getFrom(), messages[j].getDate(), messages[j].getSubject()]);
      }
    }
  }
}
特定の時間が過ぎたメールを自動的にアーカイブ
function autoArchiveEmails() {
  var threads = GmailApp.getInboxThreads();
  var now = new Date();

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    var latestMessage = messages[messages.length - 1];
    var daysAgo = (now.getTime() - latestMessage.getDate().getTime()) / 1000 / 60 / 60 / 24;
    
    if (daysAgo > 7) { // 7日以上前のメールをアーカイブ
      threads[i].moveToArchive();
    }
  }
}

このスクリプトは最新のメッセージが7日前のものであれば、そのスレッドをアーカイブします。

これらのスクリプトはすべて基本的な形で、ビジネスの具体的なニーズに合わせてカスタマイズ可能です。

Googleカレンダーの操作

Googleカレンダーの操作~基礎~

イベントを作成する
function createEvent() {
  var calendar = CalendarApp.getDefaultCalendar();
  var startTime = new Date();
  startTime.setHours(10, 0, 0); // 10:00:00に設定
  var endTime = new Date();
  endTime.setHours(12, 0, 0); // 12:00:00に設定
  calendar.createEvent('Sample Event', startTime, endTime);
}
特定の期間のイベントを取得する
function listEvents() {
  var calendar = CalendarApp.getDefaultCalendar();
  var startTime = new Date();
  startTime.setHours(0, 0, 0); // 今日の0:00:00に設定
  var endTime = new Date(startTime.getTime() + 24*60*60*1000); // 明日の0:00:00に設定
  var events = calendar.getEvents(startTime, endTime);

  for (var i = 0; i < events.length; i++) {
    Logger.log('Title: ' + events[i].getTitle());
    Logger.log('Start: ' + events[i].getStartTime());
    Logger.log('End: ' + events[i].getEndTime());
  }
}
イベントの詳細を更新する
function updateEvent() {
  var calendar = CalendarApp.getDefaultCalendar();
  var startTime = new Date();
  startTime.setHours(0, 0, 0); // 今日の0:00:00に設定
  var endTime = new Date(startTime.getTime() + 24*60*60*1000); // 明日の0:00:00に設定
  var events = calendar.getEvents(startTime, endTime);

  for (var i = 0; i < events.length; i++) {
    if (events[i].getTitle() === 'Sample Event') {
      events[i].setLocation('123 Main St');
      events[i].setDescription('This is a sample event.');
    }
  }
}

れらのスクリプトは基本的な例であり、Google Apps ScriptでGoogleカレンダーを操作する際の出発点となります。

Googleカレンダーの操作~応用~

スプレッドシートからイベントデータを読み込み、カレンダーにイベントを追加
function addEventsFromSpreadsheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var rows = sheet.getDataRange().getValues();
  var calendar = CalendarApp.getDefaultCalendar();

  for (var i = 1; i < rows.length; i++) {
    var title = rows[i][0];
    var startTime = new Date(rows[i][1]);
    var endTime = new Date(rows[i][2]);
    var description = rows[i][3];
    var location = rows[i][4];
    
    var event = calendar.createEvent(title, startTime, endTime);
    event.setDescription(description);
    event.setLocation(location);
  }
}

このスクリプトは、スプレッドシートの各行からイベントのデータを読み込み、それを使用してカレンダーに新しいイベントを作成します。スプレッドシートの列は、タイトル、開始時間、終了時間、説明、場所の順になっていると仮定しています。

特定のキーワードをタイトルに含む今日のイベントをメールで通知
function emailTodayEventsWithKeyword() {
  var keyword = 'Important';
  var calendar = CalendarApp.getDefaultCalendar();
  var now = new Date();
  var startTime = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  var endTime = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1);
  var events = calendar.getEvents(startTime, endTime);

  var message = '';
  for (var i = 0; i < events.length; i++) {
    if (events[i].getTitle().indexOf(keyword) > -1) {
      message += 'Title: ' + events[i].getTitle() + '\n';
      message += 'Start: ' + events[i].getStartTime() + '\n';
      message += 'End: ' + events[i].getEndTime() + '\n';
      message += '\n';
    }
  }

  if (message !== '') {
    MailApp.sendEmail({
      to: 'your-email@example.com',
      subject: 'Today\'s important events',
      body: message
    });
  }
}

このスクリプトは、「Important」というキーワードをタイトルに含む今日のイベントをすべてメールで通知します。

指定された期間の全てのイベントをスプレッドシートにエクスポート
function exportEventsToSpreadsheet() {
  var calendar = CalendarApp.getDefaultCalendar();
  var startDate = new Date('2023-01-01'); // 開始日
  var endDate = new Date('2023-12-31'); // 終了日
  var events = calendar.getEvents(startDate, endDate);

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear(); // 既存のデータをクリア
  sheet.appendRow(['Title', 'Start', 'End', 'Description', 'Location']); // ヘッダ行

  for (var i = 0; i < events.length; i++) {
    var title = events[i].getTitle();
    var start = events[i].getStartTime();
    var end = events[i].getEndTime();
    var desc = events[i].getDescription();
    var loc = events[i].getLocation();

    sheet.appendRow([title, start, end, desc, loc]); // イベントデータを行に追加
  }
}

このスクリプトは指定された期間の全てのイベントをスプレッドシートにエクスポートします。

これらのスクリプトはすべて基本的な形で、ビジネスの具体的なニーズに合わせてカスタマイズ可能です。

Googleフォームの操作

Googleフォームの操作~基本~

新しいフォームを作成
function createForm() {
  var form = FormApp.create('New Form');
  Logger.log('Created Form: ' + form.getTitle());
}
フォームに質問を追加
function addQuestionsToForm() {
  var form = FormApp.create('New Form');

  var item = form.addCheckboxItem();
  item.setTitle('What is your favorite color?');
  item.setChoices([
    item.createChoice('Red'),
    item.createChoice('Green'),
    item.createChoice('Blue')
  ]);

  Logger.log('Created Form: ' + form.getTitle());
}
フォームの回答を取得
function getFormResponses() {
  var form = FormApp.openById('FORM_ID_HERE'); // フォームIDを指定
  var formResponses = form.getResponses();

  for (var i = 0; i < formResponses.length; i++) {
    var response = formResponses[i];
    Logger.log('Response ID: ' + response.getId());
    Logger.log('Respondent Email: ' + response.getRespondentEmail());
    Logger.log('Response received at: ' + response.getTimestamp().toString());
    
    var itemResponses = response.getItemResponses();
    for (var j = 0; j < itemResponses.length; j++) {
      var itemResponse = itemResponses[j];
      Logger.log('Question: ' + itemResponse.getItem().getTitle());
      Logger.log('Answer: ' + itemResponse.getResponse());
    }
  }
}

Googleフォームの操作~応用~

フォーム応答からスプレッドシートへのデータ転送
function transferResponsesToSpreadsheet() {
  var form = FormApp.openById('FORM_ID_HERE'); // フォームIDを指定
  var formResponses = form.getResponses();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  for (var i = 0; i < formResponses.length; i++) {
    var response = formResponses[i];
    var itemResponses = response.getItemResponses();
    var rowData = [];

    for (var j = 0; j < itemResponses.length; j++) {
      var itemResponse = itemResponses[j];
      rowData.push(itemResponse.getResponse());
    }

    sheet.appendRow(rowData);
  }
}

このスクリプトはフォームからの応答を取得し、それを現在のスプレッドシートに追加します。

新しいフォームの生成とメールでの共有
function createAndShareForm() {
  var form = FormApp.create('New Form');

  var item = form.addCheckboxItem();
  item.setTitle('What is your favorite color?');
  item.setChoices([
    item.createChoice('Red'),
    item.createChoice('Green'),
    item.createChoice('Blue')
  ]);

  var formUrl = form.getPublishedUrl();
  MailApp.sendEmail({
    to: 'recipient@example.com',
    subject: 'Please fill out this form',
    body: 'Click on the following link to fill out the form: ' + formUrl
  });

  Logger.log('Created and Shared Form: ' + form.getTitle());
}

このスクリプトは新しいフォームを作成し、質問を追加した後、そのフォームのURLを含むメールを指定した受信者に送信します。

フォームの回答をチェックし、特定の条件を満たした場合に通知
function checkResponsesAndNotify() {
  var form = FormApp.openById('FORM_ID_HERE'); // フォームIDを指定
  var formResponses = form.getResponses();

  for (var i = 0; i < formResponses.length; i++) {
    var response = formResponses[i];
    var itemResponses = response.getItemResponses();

    for (var j = 0; j < itemResponses.length; j++) {
      var itemResponse = itemResponses[j];
      if (itemResponse.getItem().getTitle() == 'What is your favorite color?' && 
          itemResponse.getResponse() == 'Red') {
        MailApp.sendEmail({
          to: 'recipient@example.com',
          subject: 'Someone likes Red!',
          body: 'Someone answered Red to the favorite color question.'
        });
      }
    }
  }
}

このスクリプトはフォームのすべての回答をチェックし、特定の質問の回答が特定の値(この例では、”What is your favorite color?”という質問の回答が”Red”)である場合に通知メールを送ります。

これらのスクリプトはすべて基本的な形で、ビジネスの具体的なニーズに合わせてカスタマイズ可能です。

Google Apps Scriptのライブラリ

Google Apps Scriptのライブラリは、スクリプトのコードを複数のプロジェクトで共有・再利用するための方法です。ライブラリは、他のスクリプトプロジェクトから参照できるスクリプトプロジェクトとして作成されます。一度ライブラリを作成し、他のプロジェクトにリンクすれば、ライブラリ内の関数をそのプロジェクト内で使用することができます。

ライブラリを使用すると、次のようなことが可能になります

  • コードの再利用:一度ライブラリを作成すれば、そのコードを異なるスクリプトプロジェクト間で簡単に共有することができます。
  • バージョン管理:ライブラリの開発者は新しいバージョンを作成し、ユーザーは使用するバージョンを選択することができます。
  • アクセス制限:ライブラリの開発者は、誰がライブラリを使用できるかを制御することができます。

Google Apps Scriptのライブラリは、頻繁に使用するコードスニペットや一般的な関数を複数のプロジェクトで再利用したいときに便利です。

標準ライブラリ

サードパーティ製ライブラリ

おまけ

ChatGPT×Google Apps Script

Apps Script 業務の進め方を最適化
https://workspace.google.co.jp/intl/ja/products/apps-script/
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、篠原和樹です。ウェブ制作会社で働きながら、動画編集とAIツールとUnreal Engineに興味があります。今年の目標は"篠原和樹"というキーワードで検索1位獲得を目指し、セルフブランディングに励んでいます。よろしくお願いします。

目次