- 技術 💻
GAS onEditの使い方|編集時トリガーと動かない原因一覧
GAS(Google Apps Script)の onEdit は、スプレッドシートのセルの値を人が編集したときに自動で呼ばれる関数です。 スクリプトに function onEdit(e) { ... } と書いて保存するだけで動き、引数 e(イベントオブジェクト)から、編集されたセルの範囲や編集後の値を受け取れます。
この記事では、まず「onEdit が動かない」ときの原因を確認表で切り分け、そのあとにシンプルトリガー・インストール型の編集トリガー・onChange の違いと選び方、e の中身の一覧、特定シートの特定列だけで動くタイムスタンプ自動入力のコードを順に示します。時間で動かすトリガーは扱わず、編集イベントに絞っています。
確認環境:トリガーの仕様・イベントオブジェクトの項目・上限値は、Google 公式の Apps Script ドキュメント(Simple Triggers/Installable Triggers/Event Objects/Quotas)を 2026-10-06 に開いて確認しました。メソッド名と引数は型定義パッケージ @types/google-apps-script 2.0.13 と照合しています。コードは Node.js 22.22.2 で構文を確かめ、スプレッドシートとイベントオブジェクトをまねた簡易モックに入力を渡して、条件分岐と書き込み先の範囲を確認しました。記事中の「モックでの確認結果」はその出力です。
この記事の結論
- onEdit が動かないときは、①人の手による編集ではない変更(スクリプト・API)、②認証が必要なサービスの呼び出し、③30秒の上限、④関数名の違いのどれかに当たることがほとんどです。
- メール送信や他のファイルの操作をしたいなら、インストール型の編集トリガーに切り替えます。セルに日時を入れる程度ならシンプルトリガーの onEdit で足ります。
- 行や列の追加・削除といった構造の変更を拾いたいなら onChange(変更トリガー)を使います。
- 複数セルの貼り付けにも対応させるなら、
e.valueに頼らずe.rangeから値を読む書き方にします。
onEditが動かない原因の早見表
| 原因 | 確認方法 | 対処 |
|---|---|---|
スクリプトや API がセルを書き換えた(setValue など) |
値を変えたのが人の操作か、別の関数や外部の連携かを確かめる | 書き換えた側の関数から、同じ処理を直接呼ぶ |
| 数式の結果が変わっただけで、セル自体は編集していない | そのセルに数式が入っているかを見る | 数式の元になるセルの編集を監視列にする |
| フォームの回答が追加された | 行が増えたきっかけがフォーム送信かを確かめる | フォーム送信トリガー(インストール型)を使う |
| 認証が必要なサービスを呼んでいる(メール送信など) | エディタ左の「実行数」で onEdit の実行がエラーになっていないかを見る | インストール型の編集トリガーに切り替える |
| バインドされたファイル以外を操作している | 他のスプレッドシートやドライブのファイルを開く処理が無いかを見る | インストール型の編集トリガーに切り替える |
| 処理が30秒を超えている | 「実行数」で実行時間を見る | 読み書きを getValues/setValues にまとめる。重い処理はインストール型へ |
関数名が onEdit ではない(onedit、OnEdit、onEdit2 など) |
関数名の大文字・小文字と綴りを見る | function onEdit(e) に直す。別名にするならインストール型で登録する |
| 閲覧のみ・コメントのみの権限で開いている | 編集した人の共有設定を見る | 編集権限を付ける |
| エディタの「実行」ボタンで直接動かした | エラーが Cannot read properties of undefined になっていないかを見る |
シートのセルを編集して確かめる。関数の先頭に if (!e) return; を置く |
| 行や列の追加・削除、書式の変更を拾いたい | 値の編集ではなく構造の変更かを確かめる | onChange(変更トリガー)を使う |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「GAS onEditの使い方|編集時トリガーと動かない原因一覧」
表の上から2つは、公式ドキュメントの「Script executions and API requests don't cause triggers to run.(スクリプトの実行と API リクエストではトリガーは動かない)」という制限と、onEdit の説明「ユーザーがスプレッドシートの値を変更したときに動く」に基づいています。公式の例でも、Range.setValue() でセルを編集しても onEdit は動かないと明記されています。
onEditの基本:書いて保存するだけで動く
スプレッドシートのメニュー「拡張機能」→「Apps Script」でエディタを開き、次のコードを貼り付けて保存します。トリガーの登録は要りません。onEdit は Apps Script が予約している関数名で、同じ仲間に onOpen、onInstall、onSelectionChange、doGet、doPost があります。
function onEdit(e) {
const range = e.range;
console.log('シート名: ' + range.getSheet().getName());
console.log('編集範囲: ' + range.getA1Notation());
console.log('行数×列数: ' + range.getNumRows() + '×' + range.getNumColumns());
console.log('value: ' + e.value);
console.log('oldValue: ' + e.oldValue);
}
セルを編集したあと、エディタ左の「実行数」(Executions)を開くと、実行の一覧と状態を確認できます。イベントオブジェクトをまねた入力を3通り渡したときの、モックでの確認結果は次のとおりです。
(C2 を「未着手」から「作業中」に書き換えた場合の入力)
シート名: タスク
編集範囲: C2
行数×列数: 1×1
value: 作業中
oldValue: 未着手
(C3 の値を消した場合の入力)
編集範囲: C3
行数×列数: 1×1
value: undefined
oldValue: 作業中
(C2:C4 の3セルをまとめて編集した場合の入力。value と oldValue を持たない)
編集範囲: C2:C4
行数×列数: 3×1
value: undefined
oldValue: undefined
エディタの「実行」ボタンでこの関数を直接動かすと、e が渡されないため、1行目の e.range で次のエラーになります(Node.js 22 で引数なしで呼んだ結果)。
TypeError: Cannot read properties of undefined (reading 'range')
これはコードの誤りではなく、編集というきっかけが無いまま呼んだことによるものです。動作はシート上でセルを編集して確かめます。
イベントオブジェクト e の中身一覧
公式ドキュメントの「Event Objects」に載っている、スプレッドシートの編集イベントの項目です。
| プロパティ | 中身 | 使いどころ | 気を付ける点 |
|---|---|---|---|
e.range |
編集されたセルまたはセル範囲(Range オブジェクト) | getRow()、getColumn()、getNumRows()、getSheet() で場所を調べる |
複数セルの編集では範囲全体が入る |
e.value |
編集後のセルの値 | 1セルの編集で、入力された値を見る | セルを空にしたときは undefined(公式に記載) |
e.oldValue |
編集前のセルの値 | 「未着手から完了に変わった」のような変化の判定 | 編集範囲が1セルのときだけ使える。元が空のセルでは undefined(公式に記載) |
e.source |
スクリプトがバインドされているスプレッドシート(Spreadsheet オブジェクト) | e.source.getSheetByName('名前') で他のシートを取る |
SpreadsheetApp.getActiveSpreadsheet() と同じファイルを指す |
e.user |
編集したユーザー(User オブジェクト) | e.user.getEmail() で編集者を記録する |
公式の説明は「取得できる場合のみ」。セキュリティの条件によっては得られない |
e.authMode |
認証モード(ScriptApp.AuthMode の値) | 動作モードの確認 | 公式の例ではシンプルトリガーは LIMITED |
e.triggerUid |
トリガーの ID | 複数のトリガーの区別 | インストール型のときだけ入る |
e.range から場所を調べるメソッドは、次の5つを覚えておくと足ります。
| 知りたいこと | 書き方 | C2:D4 を編集したときの値 |
|---|---|---|
| 先頭の行 | e.range.getRow() |
2 |
| 先頭の列(A=1) | e.range.getColumn() |
3 |
| 行数 | e.range.getNumRows() |
3 |
| 列数 | e.range.getNumColumns() |
2 |
| シート名 | e.range.getSheet().getName() |
編集したシートの名前 |
シンプルトリガー・インストール型・onChangeの違い
編集をきっかけにするトリガーは3種類あります。関数名を onEdit にするだけで動くのがシンプルトリガー、トリガー画面やコードで登録するのがインストール型です。
| 比べる点 | シンプルトリガー onEdit | インストール型の編集トリガー | インストール型の変更トリガー(onChange) |
|---|---|---|---|
| 準備 | function onEdit(e) と書いて保存 |
トリガー画面または ScriptApp.newTrigger(...).onEdit() で登録 |
トリガー画面または ScriptApp.newTrigger(...).onChange() で登録 |
| 関数名 | onEdit 固定 |
自由 | 自由 |
| 発火する操作 | ユーザーがセルの値を変更したとき | ユーザーがセルの値を変更したとき | ユーザーがスプレッドシートの構造を変更したとき(シートの追加、列の削除など) |
| 使えるサービス | 認証が要らないものだけ。バインドされたファイルは操作できる | 認証が必要なサービスも使える(メール送信、他のファイルなど) | 認証が必要なサービスも使える |
| 実行ユーザー | 追加の承認なしで動く。編集者の特定はできない場合がある | トリガーを作成した人のアカウントで動く | トリガーを作成した人のアカウントで動く |
| 実行時間 | 30秒まで | スクリプトの実行時間の上限(6分/回)に従う | 同左 |
| e の中身 | range、value、oldValue、source、user、authMode | 左に加えて triggerUid | changeType、source、user、authMode、triggerUid(range と value は無い) |
| スクリプト・API による変更 | 動かない | 動かない | 動かない |
onChange の e.changeType に入る値は、公式ドキュメントでは EDIT、INSERT_ROW、INSERT_COLUMN、REMOVE_ROW、REMOVE_COLUMN、INSERT_GRID、REMOVE_GRID、FORMAT、OTHER の9種類です。
どれを使うかの判断表
| やりたいこと | 選ぶもの |
|---|---|
| 編集した行に日時や編集済みの印を入れる | シンプルトリガー onEdit |
| 入力値に応じて同じファイル内の別セル・別シートを書き換える | シンプルトリガー onEdit |
| 編集をきっかけにメールを送る | インストール型の編集トリガー |
| 編集をきっかけに他のスプレッドシートやドライブのファイルを操作する | インストール型の編集トリガー |
| 外部の URL へ通知する | インストール型の編集トリガー |
| 30秒では終わらない処理をする | インストール型の編集トリガー |
| 行・列の追加や削除、シートの追加、書式の変更を拾う | 変更トリガー(onChange) |
| フォームの回答が届いたら処理する | フォーム送信トリガー |
迷ったら、「セルを書き換えるだけならシンプル、メール送信や他ファイル操作があるならインストール型」と覚えると選びやすくなります。
コピペ用:特定シートの特定列だけで動くタイムスタンプ自動入力
「タスク」シートの C列(状態)が編集されたら、同じ行の D列(更新日時)に日時を入れるコードです。サンプルの表は次の形を想定しています。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | タスク | 担当 | 状態 | 更新日時 | 完了日 |
| 2 | 棚卸し | 佐藤 | 未着手 | ||
| 3 | 発注書の確認 | 鈴木 | 作業中 | ||
| 4 | 備品ラベル貼り | 高橋 | 未着手 | ||
| 5 | 貸出台帳の整理 | 田中 | 未着手 |
const TARGET_SHEET = 'タスク'; // 動かしたいシート名
const WATCH_COL = 3; // 監視する列(C列=状態)
const STAMP_COL = 4; // 日時を書く列(D列=更新日時)
const HEADER_ROWS = 1; // 見出しの行数
function onEdit(e) {
if (!e || !e.range) return; // エディタから直接実行したときは何もしない
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() !== TARGET_SHEET) return;
// 編集範囲に監視列が含まれているか
const firstCol = range.getColumn();
const lastCol = firstCol + range.getNumColumns() - 1;
if (WATCH_COL < firstCol || WATCH_COL > lastCol) return;
// 見出し行を除いた行の範囲を求める
const firstRow = Math.max(range.getRow(), HEADER_ROWS + 1);
const lastRow = range.getRow() + range.getNumRows() - 1;
if (lastRow < firstRow) return;
const numRows = lastRow - firstRow + 1;
// e.value は使わず、編集後の値をシートから読む(複数セルでも同じ書き方で動く)
const values = sheet.getRange(firstRow, WATCH_COL, numRows, 1).getValues();
const now = new Date();
const stamps = values.map(row => [row[0] === '' ? '' : now]);
sheet.getRange(firstRow, STAMP_COL, numRows, 1)
.setValues(stamps)
.setNumberFormat('yyyy/MM/dd hh:mm:ss');
}
先頭4行の定数を自分の表に合わせて書き換えれば、そのまま使えます。ポイントは3つです。
- シート名で絞る:
sheet.getName() !== TARGET_SHEETのときはすぐreturnします。onEdit はファイル内のどのシートの編集でも呼ばれるためです。 - 列は「範囲に含まれるか」で判定する:
range.getColumn() === 3だけで判定すると、B列からC列にまたがる貼り付けを拾えません。 - 値はシートから読み、まとめて書く:
getValuesとsetValuesを1回ずつにすると、行数が多い貼り付けでも30秒の上限に余裕が出ます。
モックに編集範囲を渡して、書き込み先がどうなるかを確認した結果です。
| 編集した範囲 | 入力した内容 | 日時が書き込まれた範囲 |
|---|---|---|
| C2(1セル) | 作業中 | D2 |
| C3:C5(3セル貼り付け) | 完了/空/作業中 | D3:D5(空にした C4 の行は D4 も空になる) |
| B2:C3(2列にまたがる貼り付け) | 担当と状態 | D2:D3 |
| A1:C2(見出し行を含む貼り付け) | 見出しと1行分 | D2 のみ(1行目には書かない) |
| B2(監視列の外) | 担当 | 書き込みなし |
| 別のシートの A1 | 任意 | 書き込みなし |
e.value と e.oldValue を使う書き方(1セルの編集だけを対象にする)
「状態が完了に変わったときだけ完了日を入れる」のように変化の前後を見たいときは、e.value と e.oldValue を使います。e.oldValue は1セルの編集でしか使えないため、先に行数と列数を確かめます。
const TARGET_SHEET = 'タスク';
const STATUS_COL = 3; // C列=状態
const DONE_COL = 5; // E列=完了日
function onEdit(e) {
if (!e || !e.range) return;
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() !== TARGET_SHEET) return;
// 1セルの編集だけを対象にする(e.value と e.oldValue を使うため)
if (range.getNumRows() !== 1 || range.getNumColumns() !== 1) return;
if (range.getColumn() !== STATUS_COL || range.getRow() === 1) return;
const doneCell = sheet.getRange(range.getRow(), DONE_COL);
if (e.value === '完了' && e.oldValue !== '完了') {
doneCell.setValue(new Date()); // 「完了」に変わったときだけ日付を入れる
} else if (e.value !== '完了') {
doneCell.clearContent(); // 「完了」以外に戻したら(セルを空にした場合も)消す
}
}
モックでの確認結果は次のとおりです。
| 入力(C2 の編集) | e.value | e.oldValue | E2 への処理 |
|---|---|---|---|
| 未着手 → 完了 | 完了 | 未着手 | 日付を書き込む |
| 完了 → 作業中 | 作業中 | 完了 | 内容を消す |
| 値を消す | undefined | 作業中 | 内容を消す |
| C2:C3 をまとめて編集 | (使わない) | (使わない) | 何もしない |
複数セルの貼り付けでも完了日を入れたい場合は、前の節のコードのように e.range の行数ぶん getValues で読み、値が「完了」の行だけ日付を入れる形にします。その場合は編集前の値が分からないので、「完了日が空の行だけ書く」という条件に置き換えると、同じ目的を果たせます。
インストール型の編集トリガーに切り替える手順
メール送信のように認証が必要な処理は、インストール型の編集トリガーで動かします。切り替えは次の3段階です。
- 関数名を
onEdit以外にする(例:notifyOnDone)。onEditのままだと予約名としても呼ばれ、同じ編集で2回動くことになります。 - トリガーを登録する。画面から行う方法と、コードで行う方法があります。
- シートのセルを編集して、動作を確かめる。
画面から登録する
公式ドキュメントの手順は次のとおりです。
- Apps Script のプロジェクトを開く
- 左側の「トリガー」(目覚まし時計のアイコン)をクリックする
- 右下の「トリガーを追加」をクリックする
- 実行する関数と、トリガーの種類(スプレッドシートの編集時)を選んで設定する
- 「保存」をクリックする
コードで登録する
次のコードを貼り付け、installEditTrigger をエディタから1回だけ実行します。同じトリガーを二重に作らないよう、登録済みかどうかを先に調べています。
const TARGET_SHEET = 'タスク';
const STATUS_COL = 3;
const NOTIFY_TO = 'leader@example.com'; // 通知先(例)
// インストール型の編集トリガーから呼ばれる関数(名前は onEdit 以外にする)
function notifyOnDone(e) {
if (!e || !e.range) return;
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() !== TARGET_SHEET) return;
if (range.getNumRows() !== 1 || range.getNumColumns() !== 1) return;
if (range.getColumn() !== STATUS_COL || range.getRow() === 1) return;
if (e.value !== '完了' || e.oldValue === '完了') return;
const row = range.getRow();
const task = sheet.getRange(row, 1).getValue();
const owner = sheet.getRange(row, 2).getValue();
const subject = '【完了】' + task;
const body = 'タスク「' + task + '」が完了になりました。\n担当: ' + owner + '\n行: ' + row;
MailApp.sendEmail(NOTIFY_TO, subject, body);
}
// 1回だけ実行して、編集トリガーを登録する
function installEditTrigger() {
const exists = ScriptApp.getProjectTriggers().some(t =>
t.getHandlerFunction() === 'notifyOnDone' &&
t.getEventType() === ScriptApp.EventType.ON_EDIT);
if (exists) {
console.log('登録済みのため何もしません');
return;
}
ScriptApp.newTrigger('notifyOnDone')
.forSpreadsheet(SpreadsheetApp.getActive())
.onEdit()
.create();
console.log('編集トリガーを登録しました');
}
// 登録を外す
function uninstallEditTrigger() {
ScriptApp.getProjectTriggers()
.filter(t => t.getHandlerFunction() === 'notifyOnDone')
.forEach(t => ScriptApp.deleteTrigger(t));
console.log('編集トリガーを削除しました');
}
モックで installEditTrigger を2回続けて呼び、そのあと状態を「完了」に変えた入力を渡した結果です。
編集トリガーを登録しました
登録済みのため何もしません
(登録されているトリガーの数: 1)
(C3 を「作業中」から「完了」にした入力 → 送信内容)
宛先: leader@example.com
件名: 【完了】発注書の確認
本文: タスク「発注書の確認」が完了になりました。
担当: 鈴木
行: 3
(C3 を「完了」から「作業中」に戻した入力 → 送信なし)
インストール型で知っておきたい点を、公式ドキュメントの記載からまとめます。
| 項目 | 内容 |
|---|---|
| 実行アカウント | トリガーを作成した人のアカウントで動く。メールは作成者のアカウントから送られる |
| 他の人が作ったトリガー | 自分のトリガー画面には表示されない(動作はする) |
| トリガーの数 | 1ユーザー・1スクリプトあたり 20個まで |
| トリガーの合計実行時間 | 一般のアカウントは 90分/日、Google Workspace は 6時間/日 |
| 1回の実行時間 | 6分/回 |
| メールの宛先数 | 一般のアカウントは 100件/日、Google Workspace は 1,500件/日 |
上限値は変わることがあるため、公式の「Quotas for Google Services」で最新の値を確認してください。
onChangeで行・列の追加や削除を拾う
行の挿入や削除は「値の編集」ではなく「構造の変更」なので、変更トリガーで受け取ります。e.range は無いので、e.changeType で種類を見て、必要ならシートを読み直します。
// 変更トリガーから呼ばれる関数
function logChange(e) {
console.log('変更の種類: ' + e.changeType);
if (e.changeType === 'INSERT_ROW' || e.changeType === 'REMOVE_ROW') {
console.log('行の増減がありました。行数: ' + e.source.getSheetByName('タスク').getLastRow());
}
}
// 1回だけ実行して、変更トリガーを登録する
function installChangeTrigger() {
const exists = ScriptApp.getProjectTriggers().some(t =>
t.getHandlerFunction() === 'logChange' &&
t.getEventType() === ScriptApp.EventType.ON_CHANGE);
if (exists) return;
ScriptApp.newTrigger('logChange')
.forSpreadsheet(SpreadsheetApp.getActive())
.onChange()
.create();
}
モックに changeType を渡したときの確認結果です。
(changeType が INSERT_ROW の入力)
変更の種類: INSERT_ROW
行の増減がありました。行数: 5
(changeType が FORMAT の入力)
変更の種類: FORMAT
確かめて分かったこと
- インストール型に切り替えても、スクリプトや API による変更では動きません。 公式の制限は、シンプルトリガーとインストール型の両方のページに同じ文で書かれています。スクリプトが書き換えた結果に反応させたいときは、書き換えた関数から処理を直接呼びます。
e.oldValueが undefined になる場面は2つあります。 編集範囲が複数セルのときと、元が空のセルを編集したときです。「空から完了になった」も拾えるよう、e.oldValue !== '完了'のように「完了ではなかった」という条件で書くと両方を扱えます。e.valueはセルを空にしたとき undefined になります。e.value === ''では判定できないため、e.value === undefinedか、シートから読んだ値が''かで判定します。- onChange のイベントオブジェクトには range が無いため、どのセルが変わったかは分かりません。値の編集の場所を知りたいときは編集トリガー、構造の変更を知りたいときは変更トリガー、と役割を分けます。
- シンプルトリガーの30秒は、スクリプト全体の6分とは別の上限です。 セルを1つずつ読み書きするループは時間がかかるので、範囲でまとめて扱う書き方が向いています。
- 列の判定を「先頭の列が一致するか」だけにすると、2列にまたがる貼り付けを拾えません。 モックで B2:C3 を渡したところ、「範囲に含まれるか」の判定で D2:D3 に書き込まれることを確認できました。
公開前のチェックリスト
| 確認すること | 見るところ |
|---|---|
関数名は onEdit(シンプル)か、登録した名前(インストール型)か |
エディタの関数名とトリガー画面 |
| 対象のシート名と列番号で絞っているか | 関数の先頭の return |
| 見出し行を除いているか | 行番号の判定 |
| 複数セルの貼り付け、行の削除でも想定どおりか | シートで実際に貼り付けて確かめる |
| セルを空にしたときの動きを決めているか | e.value が undefined の分岐 |
| シートから読む回数と書く回数は少ないか | getValues/setValues の回数 |
| インストール型のトリガーが二重に登録されていないか | トリガー画面の一覧 |
よくある質問
Q. onEdit とは何ですか?
A. スプレッドシートのセルの値をユーザーが変更したときに、自動で呼ばれる Apps Script の関数です。function onEdit(e) と書いて保存するだけで動き、登録の操作は要りません。
Q. onEdit とインストール型の編集トリガーの違いは? A. 認証が必要なサービスを使えるかどうかが一番の違いです。シンプルトリガーの onEdit はメール送信や他のファイルの操作ができず30秒までですが、インストール型はトリガーを作成した人のアカウントで動き、それらの処理を行えます。
Q. onEdit でメールを送れないときは?
A. インストール型の編集トリガーに切り替えると送れます。関数名を onEdit 以外に変え、トリガー画面か ScriptApp.newTrigger('関数名').forSpreadsheet(...).onEdit().create() で登録します。
Q. スクリプトで setValue した変更に onEdit を反応させるには? A. トリガーでは反応しないため、setValue を呼んだ関数の中から同じ処理を直接呼びます。この制限はシンプルトリガーにもインストール型にも当てはまります。
Q. 複数セルを貼り付けたとき e.value が使えない場合は?
A. e.range から行数と列数を取り、getValues() で編集後の値を読みます。この記事のタイムスタンプのコードは、1セルでも複数セルでも同じ書き方で動く形にしています。
まとめ
- onEdit は人がセルの値を編集したときに動く。スクリプトや API による変更では動かない
- 動かないときは、変更のきっかけ・認証が必要なサービス・30秒の上限・関数名の順に確かめる
- メール送信や他ファイルの操作はインストール型の編集トリガーで行う。関数名は
onEdit以外にする - 行や列の追加・削除は onChange。イベントオブジェクトは changeType を持ち、range は持たない
e.oldValueは1セルの編集のときだけ使える。e.valueはセルを空にすると undefined- 複数セルの貼り付けに対応するなら、
e.rangeの行数ぶんgetValuesで読み、setValuesでまとめて書く - インストール型のトリガーは1ユーザー・1スクリプトあたり20個まで。登録前に重複を調べる
参考・出典
- Google Apps Script「Simple Triggers」 https://developers.google.com/apps-script/guides/triggers (2026-10-06 閲覧。予約されている関数名、制限事項)
- Google Apps Script「Installable Triggers」 https://developers.google.com/apps-script/guides/triggers/installable (2026-10-06 閲覧。編集トリガーと変更トリガーの違い、登録手順、制限事項)
- Google Apps Script「Event Objects」 https://developers.google.com/apps-script/guides/triggers/events (2026-10-06 閲覧。編集イベント・変更イベントの項目)
- Google Apps Script「Quotas for Google Services」 https://developers.google.com/apps-script/guides/services/quotas (2026-10-06 閲覧。実行時間、トリガーの数と合計実行時間、メールの宛先数)
- Google Apps Script「Logging」 https://developers.google.com/apps-script/guides/logging (2026-10-06 閲覧。実行の一覧の開き方)
- Google Apps Script「Extending Google Sheets」 https://developers.google.com/apps-script/guides/sheets (2026-10-06 閲覧。エディタの開き方)
- 型定義パッケージ @types/google-apps-script 2.0.13(npm。ScriptApp・SpreadsheetTriggerBuilder・Range のメソッド名と引数)
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「GAS onEditの使い方|編集時トリガーと動かない原因一覧」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。