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段階です。

  1. 関数名を onEdit 以外にする(例:notifyOnDone)。onEdit のままだと予約名としても呼ばれ、同じ編集で2回動くことになります。
  2. トリガーを登録する。画面から行う方法と、コードで行う方法があります。
  3. シートのセルを編集して、動作を確かめる。

画面から登録する

公式ドキュメントの手順は次のとおりです。

  1. Apps Script のプロジェクトを開く
  2. 左側の「トリガー」(目覚まし時計のアイコン)をクリックする
  3. 右下の「トリガーを追加」をクリックする
  4. 実行する関数と、トリガーの種類(スプレッドシートの編集時)を選んで設定する
  5. 「保存」をクリックする

コードで登録する

次のコードを貼り付け、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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?