2017-12-31 67 views
0

このコードは、初めて入力したデータをヘルパーシートと比較し、ヘルパーシートに格納されているデータを返すことによって、変更は既に塗りつぶされたセルで行われます。セルに既に入力されたデータが変更されないようにするコードを修正する

質問:このコードの問題は、複数のセルを選択してキーボードの削除をクリックすると、すべてのセルが削除され、コードが正常に動作しない場合です。どうすればこの問題を解決できますか?

コード:

function onEdit() { 


    var masterSheetName = "sheet1" // sheet where the cells are protected from updates 
    var helperSheetName = "Helper" // sheet where the values are copied for later checking 
    var firstDataRow = 1; // only take into account edits on or below this row 
    var firstDataColumn = 1; // only take into account edits on or to the right of this column 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var masterSheet = ss.getActiveSheet(); 
    if (masterSheet.getName() != masterSheetName) return; 

    var masterCell = masterSheet.getActiveCell(); 
    if (masterCell.getRow() < firstDataRow || masterCell.getColumn() < firstDataColumn) return; 

    var helperSheet = ss.getSheetByName(helperSheetName); 
    var helperCell = helperSheet.getRange(masterCell.getA1Notation()); 
    var newValue = masterCell.getValue(); 
    var oldValue = helperCell.getValue(); 

    if (oldValue == "") { 
    helperCell.setValue(newValue); 
    } else { 
    masterCell.setValue(oldValue); 
    } 
} 
+0

質問は何ですか?どの問題を解決しますか?あなたは何を期待していますか? –

+0

問題は、コードが適切に機能しないことです。ユーザーが複数のセルを選択して削除した場合、複数の選択からシートを保護したり、すべてをチェックするためにこのスクリプトを変更するにはどうすればいいですかアクティブなセルだけでなく、ダイナミックにセル? –

答えて

0

これはあなたのために働くかどうかを確認してください。選択した範囲のサイズをチェックし、1つのセルより大きい場合は、範囲をヘルパーシート値にリセットします。あなたは複数のセルが選択され、削除キーが押されたインスタンスに対して明示的にリッスンするイベントリスナーを追加する必要が私に似

function onEdit() { 
    var masterSheetName = "sheet1" // sheet where the cells are protected from updates 
    var helperSheetName = "Helper" // sheet where the values are copied for later checking 
    var firstDataRow = 1; // only take into account edits on or below this row 
    var firstDataColumn = 1; // only take into account edits on or to the right of this column 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var masterSheet = ss.getActiveSheet(); 
    if (masterSheet.getName() != masterSheetName) return; 
    var masterCell = masterSheet.getActiveCell(); 
    if (masterCell.getRow() < firstDataRow || masterCell.getColumn() < firstDataColumn) return; 
    var helperSheet = ss.getSheetByName(helperSheetName); 
    var helperCell = helperSheet.getRange(masterCell.getA1Notation()); 
    var newValue = masterCell.getValue(); 
    var oldValue = helperCell.getValue(); 

    if (oldValue == "") { 
     helperCell.setValue(newValue); 
    } else { 
     masterCell.setValue(oldValue); 
    } 
    var test=masterSheet.getActiveRange().getA1Notation()//get the selected range 
    var testsize=masterSheet.getActiveRange().getValues()//create an array of selected values 
    var size=testsize.length// array length 
    if(size>1){//if length of selected range is greater than one cell 
     Browser.msgBox("Select only one cell") 
     var helperSheet1 = ss.getSheetByName(helperSheetName).getRange(test).getValues(); 
     var masterSheet1= ss.getSheetByName(masterSheetName).getRange(test).getValues(); 
     var masterSheet1= ss.getSheetByName(masterSheetName).getRange(test).setValues(helperSheet1);//reset range 
    } 
} 
0

ですね、そしてちょうどヘルパーシートからデータセットを再作成するためにコールバックを追加

0

範囲保護は、入力されたデータが変更されないようにするための内蔵機能です。古い値を上書きする代わりに使用します。 protect()を使用して保護設定を変更できます。

OPコードに関しては、編集イベントオブジェクトを逃し、代わりに "getActiveSomething"メソッドを使用します。これは非効率的です。一方、コードはgetActiveCellを使用してアクティブなセルを返しますが、editイベントオブジェクトのrangeプロパティは編集中の範囲を返します。

範囲保護を使用できない場合は、値を複数のセルに貼り付ける、または複数のセルを削除するなど、複数のセルを同時に編集するOPコードの代わりに、次のような方法があります。

注1:コードを簡略化するために、OPコードの一部の検証は省略されています。

注2:空のセルを含む範囲を貼り付ける場合は考慮しませんが、他のセルは含まない範囲を貼り付ける場合は考慮しません。

function onEdit(e) { 
    // If the edit is made on an invalid sheet, exit. 
    if(e.range.getSheet().getName() != 'Sheet1') return; 

    // Count the number of cells being edited 
    var cellsNumber = [].concat.apply([],e.range.getValues()).length; 

    if(cellsNumber == 1){ 
    var helper = e.source.getSheetByName('Helper').getRange(e.range.getA1Notation()); 
    if(e.range.getValue() != ''){ 
     helper.setValue(e.value); 
    } else { 
     e.range.setValue(helper.getValue()); 
    } 
    } else { 
    var helper = e.source.getSheetByName('Helper').getRange(e.range.getA1Notation()); 

    // Count the number of characters on the edited range 
    var charsNumber = [].concat.apply([],e.range.getValues()).join('').length; 

    if(charsNumber > 0) { 

     helper.setValues(e.range.getValues()); 
    } else { 
     e.range.setValues(helper.getValues()); 
    } 
    } 
} 
+0

これを取得しています。TypeError:プロパティ "range"を未定義から読み取ることができません。 (行93、ファイル "コード"):if(e.range.getSheet()。getName()!= 'Sheet1')return; –

+0

うまく動いていますが、3つのonEdit関数を使用しています。他の2つの関数を使用することができません。他のonEdit関数でどのように使用するか考えていますか? –

+0

@MostafaAbusamra同じ関数名を使用する場合、新しいインスタンスはすべて前の定義を上書きします。それぞれに異なる名前を割り当てると、それぞれの "マスター" onEdit関数からそれぞれを呼び出すことができます。 –

関連する問題