こちらの質問の関連です。
上記の質問で作ったスクリプトを強化しようと思いました。
そこで、
「変更のあったセルの左隣のセルが空白ではなく、
変更のあったセルの値が変更のあったセルの左隣のセルの値よりも小さかった時に、
変更のあったセルに1を入力して、
変更のあったセルの有る行の下の行の2列目に0を入力して、
変更のあったセルの有る行の下の行の3列目に変更のあったセルの値を入力して
右隣にアクティブセルを移動」
ということがしたくて、スクリプトを書きました。
javaScript
1// シートに変更があった時に実行する関数 2function onEditEvent24() { 3 // 変更のあったシート 4 var ss = SpreadsheetApp.getActiveSpreadsheet(); 5 var sh = ss.getActiveSheet(); 6 // 変更のあったセル 7 var cell = ss.getActiveRange(); 8 // 変更のあったセルの有る行番号 9 var r = cell.getRow(); 10 // 変更のあったセルの有る列番号 11 var c = cell.getColumn(); 12 // 変更のあったセルの左隣のセル 13 var cellLeft = sh.getRange(r, c-1); 14 // 変更のあったセルの値 15 var val = cell.getValue(); 16 // 変更のあったセルの左隣のセルの値 17 var val2 = cellLeft.getValue(); 18 // 変更のあったセルの左隣のセルの値が空白ではなく、変更のあったセルの値が変更のあったセルの左隣のセルの値よりも小さかった時に 19 if( ( val2 != "" && val2 > val ) ) { 20 // 変更のあったセルの有る行の下の行の2列目を選択 21 var rowRange = sh.getRange(r+1, 2); 22 // 変更のあったセルの有る行の下の行の3列目を選択 23 var rowRangeRight = sh.getRange(r+1, 3); 24 // 変更のあったセルに1を入力 25 cell.setValue(1) ; 26 // 変更のあったセルの有る行の下の行の2列目に0を入力 27 rowRange.setValue(0) ; 28 // 変更のあったセルの有る行の下の行の3列目に変更のあったセルの値を入力して右隣にアクティブセルを移動 29 rowRangeRight.setValue(val).offset(0, 1).activate(); 30 } 31}
このスクリプトを実行しても、特に反応はありません。
しかし、実行トランスクリプトにはエラーは出ていません。
私の予想では、IF関数の中が混乱しているのではないかと思うのですが、
期待通りの結果を得るには、それをどのように書けばよいかわかりません。
アドバイスをいただけると嬉しいです。
#~解決後のまとめ~
Zuishinさんの回答を参考に解決しましたので、まとめておきます!
というか、後日談的なやつです。
今回の質問のネックは、トリガーの設定変更時に、
一旦そのトリガーを削除していなかったらしいことだったみたいです。
トリガーの設定を変更する際は、一度そのトリガーを削除して、
もう一度、初めから設定し直す必要があるみたいですね。
今回もそのようにしたつもりだったのですが、していなかった模様…?
設定し直すと、やはり「値の変更」でも「編集時」でも、
仮にイベントハンドラでなくても、動作するみたいですね。
お騒がせいたしました…。
後日談。
質問文には書いていなかったことなのですが、
今回、スプレッドシートのA列に日付リストがある状態で、
B列からデータを入力していくという状況であり、
私がもともと書いていたスクリプトのIF関数の条件、
javaScript
1 // 変更のあったセルの左隣のセルの値が空白ではなく、変更のあったセルの値が変更のあったセルの左隣のセルの値よりも小さかった時に 2 if( ( val2 != "" && val2 > val ) )
このなかの前半部分「変更のあったセルの左隣のセルの値が空白ではなく、」だけでは、
日付リストの横のデータを入力したときにも反応してしまうということがわかったので、
「変更のあったセルの2つ左隣のセル」の情報も取得して活用することで、
日付リストの横にデータを入力したら反応してしまう問題を解決しました。
最終的にはこんな感じのスクリプトになりましたので、お納めください(?)。
javaScript
1function onEdit(e) { 2 // 変更のあったシート 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var sh = ss.getActiveSheet(); 5 // 変更のあったセル 6 var cell = ss.getActiveRange(); 7 Logger.log(cell); 8 // 変更のあったセルの有る行番号 9 var r = cell.getRow(); 10 Logger.log(r); 11 // 変更のあったセルの有る列番号 12 var c = cell.getColumn(); 13 Logger.log(c); 14 // 変更のあったセルの左隣のセル 15 var cellLeft = sh.getRange(r, c - 1); 16 Logger.log(cellLeft); 17 // 変更のあったセルの2つ左隣のセル 18 var cell2Left = sh.getRange(r, c - 2); 19 Logger.log(cell2Left); 20 // 変更のあったセルの値 21 var val = cell.getValue(); 22 Logger.log(val); 23 // 変更のあったセルの左隣のセルの値 24 var val2 = cellLeft.getValue(); 25 Logger.log(val2); 26 // 変更のあったセルの2つ左隣のセルの値 27 var val3 = cell2Left.getValue(); 28 Logger.log(val3); 29 // 変更のあったセルが変更のあったセルの2つ左隣のセルの値よりも小さいか、変更のあったセルの左隣のセルの値が空白ではなく、変更のあったセルの値が変更のあったセルの左隣のセルの値よりも小さかった時に 30 if( ( ( ( val < val3 ) || ( val2 != "" ) ) && val2 > val ) ) { 31 Logger.log( ( ( val < val3 ) || ( val2 != "" ) && val2 > val ) ); 32 // 変更のあったセルの有る行の下の行の2列目を選択 33 var rowRange = sh.getRange(r+1, 2); 34 // 変更のあったセルの有る行の下の行の3列目を選択 35 var rowRangeRight = sh.getRange(r+1, 3); 36 // 変更のあったセルに1を入力 37 cell.setValue(1) ; 38 // 変更のあったセルの有る行の下の行の2列目に0を入力 39 rowRange.setValue(0) ; 40 // 変更のあったセルの有る行の下の行の3列目に変更のあったセルの値を入力して右隣にアクティブセルを移動 41 rowRangeRight.setValue(val).offset(0, 1).activate(); 42 } 43}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/29 00:56
2018/03/29 01:15
2018/03/29 02:06
2018/03/29 02:46
2018/03/29 03:37 編集