質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

2222閲覧

GASのonEdit(e)関数内のe.rangeで取得されるセルについて

AMI

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2023/07/12 10:39

実現したいこと

GASのonEdit(e)関数を実装したスプレッドシートにおいて
e.rangeを使用してどのセルが変更されたかを調べたい。

通常のセル変更に対しては想定通り変更されたセルが取得されるのですが
行や列の挿入時は、セルが取得されたりされなかったりして法則がつかめません。

行や列の挿入に対してe.rangeはどのようなセルを取得するかわかりますでしょうか。

前提

以下の画像のような10x10のセルにすべて「a」が入力されているスプレッドシートを準備しました。
スプレッドシートには該当のソースコードが実装されています。

  • A1セルの値を「a」から「b」に変更すると想定通り「A1」がメッセージボックスに表示されます
  • A1:J10セルに一括で「b」をペーストすると想定通り「A1:J10」がメッセージボックスに表示されます
  • A列を選択して「右に1列挿入」すると「B1」がメッセージボックスに表示されます
  • H列を選択して「右に1列挿入」するとスクリプトは動作しません

このA列とH列の判定の違いは何でしょうか。法則がつかめず困っております。

▼ 準備したスプレッドシート
イメージ説明

▼ A列の右に1列挿入するとB1が変更されたと判定される
イメージ説明

▼ H列の右に1列挿入すると変更されたと判定されない
イメージ説明

該当のソースコード

Google

1function onEdit(e) { 2 const editedRange = e.range; 3 Browser.msgBox(editedRange.getA1Notation()); 4}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

onEditにて正確に行、列の追加でトリガーが動作しない原因については分かりません。

ですが、下記のような感じの関数を作成し、手動でトリガーを設定すると行、列の追加、削除や編集を取得できました。

JavaScript

1function onChange(e) { 2 var editedRange = e.source.getActiveRange(); 3 var startrow = editedRange.getRow(); 4 var endrow = editedRange.getLastRow(); 5 var startcol = editedRange.getColumn(); 6 var endcol = editedRange.getLastColumn(); 7 8 9 switch (e.changeType){ 10 case "INSERT_ROW": 11 if (startrow === endrow) { 12 // 1行追加 13 Browser.msgBox(`行を追加 = ${startrow}行目`); 14 } else { 15 // 複数行追加 16 Browser.msgBox(`行を追加 = ${startrow}行目~${endrow}行目`); 17 } 18 break; 19 20 case "REMOVE_ROW": 21 if (startrow === endrow) { 22 // 1行削除 23 Browser.msgBox(`行を削除 = ${startrow}行目`); 24 } else { 25 // 複数行削除 26 Browser.msgBox(`行を削除 = ${startrow}行目~${endrow}行目`); 27 } 28 break; 29 30 case "INSERT_COLUMN": 31 if (startcol === endcol) { 32 // 1列追加 33 Browser.msgBox(`列を追加 = ${startcol}列目`); 34 } else { 35 // 複数列追加 36 Browser.msgBox(`列を追加 = ${startcol}列目~${endcol}列目`); 37 } 38 break; 39 40 case "REMOVE_COLUMN": 41 if (startcol === endcol) { 42 // 1列削除 43 Browser.msgBox(`列を削除 = ${startcol}列目`); 44 } else { 45 // 複数列削除 46 Browser.msgBox(`列を削除 = ${startcol}列目~${endcol}列目`); 47 } 48 break; 49 50 case "EDIT": 51 Browser.msgBox(`編集 = ${editedRange.getA1Notation()}`); 52 break; 53 } 54}

イメージ説明

投稿2023/07/13 02:50

YAmaGNZ

総合スコア10447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AMI

2023/07/14 03:09

ご回答ありがとうございます。まずは私の実施したいことができました。 たしかにonEditよりもonChangeの方が「e.changeType」というプロパティを使用できるので今回の案件には適していますね。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問