下記のようなスクリプトを書きました。
下記のスクリプトにおいて、
function onEdit1()はシート「歩数計」のみに働くように、
function onEdit2()はシート「睡眠記録」のみに働くように、
function onEdit3()はシート「10食品群」のみに働くように、
それぞれしたいのですが、
どうも、相互的に?反応してしまうようです。
これを解決するためには、どうすればよいでしょうか。
具体的には、項目ごとにスプレッドシートがあり、
それらの入力用シートだけを集めたスプレッドシートを作ってみたのです。
(IMPORTRANGEを使って、リンクさせている)
よろしくお願いします。
javaScript
1function onEdit(e){ 2 onEdit1(); 3 onEdit2(); 4 onEdit3(); 5} 6 7// シートに変更があった時に実行する関数 8function onEdit1() { 9 // 変更のあったシート 10 var ss = SpreadsheetApp.getActive().getSheetByName("歩数計"); 11 // 変更のあったセル 12 var cell = ss.getActiveRange(); 13 // 変更のあったセルの値 14 var val = cell.getValue(); 15 // 変更のあったセルの文字列がnだった時に 16 if( ( val == "n" ) ) { 17 cell.setValue("バンザイなし") ; 18 } 19 // 変更のあったセルの文字列がaだった時に 20 if( ( val == "a" ) ) { 21 cell.setValue("バンザイあり") ; 22 } 23} 24 25function onEdit2() { 26 // 変更のあったシート 27 var ss = SpreadsheetApp.getActive().getSheetByName("睡眠記録"); 28 // 変更のあったセル 29 var cell = ss.getActiveRange(); 30 Logger.log(cell); 31 // 変更のあったセルの有る行番号 32 var r = cell.getRow(); 33 Logger.log(r); 34 // 変更のあったセルの有る列番号 35 var c = cell.getColumn(); 36 Logger.log(c); 37 // 変更のあったセルの左隣のセル 38 var cellLeft = ss.getRange(r, c - 1); 39 Logger.log(cellLeft); 40 // 変更のあったセルの2つ左隣のセル 41 var cell2Left = ss.getRange(r, c - 2); 42 Logger.log(cell2Left); 43 // 変更のあったセルの値 44 var val = cell.getValue(); 45 Logger.log(val); 46 // 変更のあったセルの左隣のセルの値 47 var val2 = cellLeft.getValue(); 48 Logger.log(val2); 49 // 変更のあったセルの2つ左隣のセルの値 50 var val3 = cell2Left.getValue(); 51 Logger.log(val3); 52 // 変更のあったセルが変更のあったセルの2つ左隣のセルの値よりも小さいか、変更のあったセルの左隣のセルの値が空白ではなく、変更のあったセルの値が変更のあったセルの左隣のセルの値よりも小さかった時に 53 if( ( ( ( val < val3 ) || ( val2 != "" ) ) && val2 > val ) ) { 54 Logger.log( ( ( val < val3 ) || ( val2 != "" ) && val2 > val ) ); 55 // 変更のあったセルの有る行の下の行の2列目を選択 56 var rowRange = ss.getRange(r+1, 2); 57 // 変更のあったセルの有る行の下の行の3列目を選択 58 var rowRangeRight = ss.getRange(r+1, 3); 59 // 変更のあったセルに1を入力 60 cell.setValue(1) ; 61 // 変更のあったセルの有る行の下の行の2列目に0を入力 62 rowRange.setValue(0) ; 63 // 変更のあったセルの有る行の下の行の3列目に変更のあったセルの値を入力して右隣にアクティブセルを移動 64 rowRangeRight.setValue(val).offset(0, 1).activate(); 65 } 66} 67 68// シートに変更があった時に実行する関数 69function onEdit3() { 70 // 変更のあったシート 71 var ss = SpreadsheetApp.getActive().getSheetByName("10食品群"); 72 // 変更のあったセル 73 var cell = ss.getActiveRange(); 74 // 変更のあったセルの値 75 var val = cell.getValue(); 76 // 変更のあったセルの文字列がnだった時に 77 if( ( val == "m" ) ) { 78 cell.setValue("○") ; 79 } 80}
#~解決後のまとめ~
mix-peachさんの回答を参考に解決しましたので、まとめておきます!
「変更されたシート名を取得すること」、ここがネックだったのですね。
そして、switch文というものに、今回初めて出会いました。条件分岐というのですね。
構造も、知ってしまえばわかりやすくてよいですね! 学習しました。
javaScript
1function onEdit(e){ 2 3 //今変更されたシート名を取得 (どう取得できるかはお調べください^^;) 4 var edit_sheet_name = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetName(); 5 Logger.log(edit_sheet_name); 6 7 switch (edit_sheet_name){ 8 case '歩数計': 9 onEdit1(); 10 break; 11 12 case '睡眠記録': 13 onEdit2(); 14 break; 15 16 case '10食品群': 17 onEdit3(); 18 break; 19 } 20} 21 22// シートに変更があった時に実行する関数 23function onEdit1() { 24 // 変更のあったシート 25 var ss = SpreadsheetApp.getActive().getSheetByName("歩数計"); 26 // 変更のあったセル 27 var cell = ss.getActiveRange(); 28 // 変更のあったセルの値 29 var val = cell.getValue(); 30 // 変更のあったセルの文字列がnだった時に 31 if( ( val == "n" ) ) { 32 cell.setValue("バンザイなし") ; 33 } 34 // 変更のあったセルの文字列がaだった時に 35 if( ( val == "a" ) ) { 36 cell.setValue("バンザイあり") ; 37 } 38} 39 40function onEdit2() { 41 // 変更のあったシート 42 var ss = SpreadsheetApp.getActive().getSheetByName("睡眠記録"); 43 // 変更のあったセル 44 var cell = ss.getActiveRange(); 45 Logger.log(cell); 46 // 変更のあったセルの有る行番号 47 var r = cell.getRow(); 48 Logger.log(r); 49 // 変更のあったセルの有る列番号 50 var c = cell.getColumn(); 51 Logger.log(c); 52 // 変更のあったセルの左隣のセル 53 var cellLeft = ss.getRange(r, c - 1); 54 Logger.log(cellLeft); 55 // 変更のあったセルの2つ左隣のセル 56 var cell2Left = ss.getRange(r, c - 2); 57 Logger.log(cell2Left); 58 // 変更のあったセルの値 59 var val = cell.getValue(); 60 Logger.log(val); 61 // 変更のあったセルの左隣のセルの値 62 var val2 = cellLeft.getValue(); 63 Logger.log(val2); 64 // 変更のあったセルの2つ左隣のセルの値 65 var val3 = cell2Left.getValue(); 66 Logger.log(val3); 67 // 変更のあったセルが変更のあったセルの2つ左隣のセルの値よりも小さいか、変更のあったセルの左隣のセルの値が空白ではなく、変更のあったセルの値が変更のあったセルの左隣のセルの値よりも小さかった時に 68 if( ( ( ( val < val3 ) || ( val2 != "" ) ) && val2 > val ) ) { 69 Logger.log( ( ( val < val3 ) || ( val2 != "" ) && val2 > val ) ); 70 // 変更のあったセルの有る行の下の行の2列目を選択 71 var rowRange = ss.getRange(r+1, 2); 72 // 変更のあったセルの有る行の下の行の3列目を選択 73 var rowRangeRight = ss.getRange(r+1, 3); 74 // 変更のあったセルに1を入力 75 cell.setValue(1) ; 76 // 変更のあったセルの有る行の下の行の2列目に0を入力 77 rowRange.setValue(0) ; 78 // 変更のあったセルの有る行の下の行の3列目に変更のあったセルの値を入力して右隣にアクティブセルを移動 79 rowRangeRight.setValue(val).offset(0, 1).activate(); 80 } 81} 82 83// シートに変更があった時に実行する関数 84function onEdit3() { 85 // 変更のあったシート 86 var ss = SpreadsheetApp.getActive().getSheetByName("10食品群"); 87 // 変更のあったセル 88 var cell = ss.getActiveRange(); 89 // 変更のあったセルの値 90 var val = cell.getValue(); 91 // 変更のあったセルの文字列がnだった時に 92 if( ( val == "m" ) ) { 93 cell.setValue("○") ; 94 } 95}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/05 01:02 編集
退会済みユーザー
2018/04/05 01:41
2018/04/05 01:51