0

アプリ スクリプトを使用して Google スプレッドシートでデータ検証ルールを設定する際に問題が発生しました。以下に 2 つの関数を示します。1 つは、ユーザーが何らかの方法でスプレッドシートを変更するたびにトリガーされる onChange 関数です。

updatenamedataVal() 関数は、特定のシートから行を追加/削除するたびにトリガーされます。

すべてが正常に機能し、コードが実行されます。しかし、セルにはデータ検証が設定されていません! どうしたの?

function myonChange(e){
  var ss = e.source.getActiveSheet();
  var ssname = ss.getSheetName();
  if((e.changeType === 'INSERT_COLUMN' || e.changeType === 'REMOVE_COLUMN') && ssname !== 'Aggregates'){
    Browser.msgBox('Whoops!','You are not allowed to add/remove columns. Please undo action by pressing CTRL+Z', Browser.Buttons.OK);  
  }
  else if((e.changeType === 'INSERT_ROW' || e.changeType === 'REMOVE_ROW') && ssname === 'Teacher Details'){
    var ssrange = ss.getDataRange();
    var valrange = ss.getRange(2,3,ssrange.getLastRow(),1);
    updatenamecelldataVal(valrange);
  } 
};


function updatenamecelldataVal(valrange){
      var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
      var numsheets = SpreadsheetApp.getActiveSpreadsheet().getNumSheets();
      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(valrange).build();
      for(var i = 0; i < numsheets; i++){
        var sheetname = sheets[i].getName();
        var sheetrange = sheets[i].getDataRange();
        var sheetlastrow = sheetrange.getLastRow();
        if(sheetname !== 'Teacher Details' && sheetname !== 'Aggregates' && sheetname !== 'List of Subjects'){
          for(var j = 0; j < (sheetlastrow/17); j++){
            var namecell = sheetrange.getCell(4+(17*j), 2);
            namecell.clearDataValidations();
            namecell.setDataValidation(rule); 
          }
        }
      }
    }; 
4

2 に答える 2

1

次のコードは期待どおりに機能します。行 4、列 2 でセルのデータ検証を設定します。テスト環境を調整するためにいくつかの行を変更しました。

/*
In the Spreadsheet, create new trigger:
Run: onChange
Events: From spreadsheet
On change
*/

function onChange(e) {
  var ss = e.source, valrange;
  var s = ss.getActiveSheet();
  var sname = s.getSheetName();
  if((e.changeType === 'INSERT_COLUMN' || e.changeType === 'REMOVE_COLUMN') && sname !== 'Aggregates')
    Browser.msgBox('Whoops!','You are not allowed to add/remove columns. Please undo action by pressing CTRL+Z', Browser.Buttons.OK);  
  else if((e.changeType === 'INSERT_ROW' || e.changeType === 'REMOVE_ROW') && sname === 'Teacher Details') {
    valrange = s.getRange(2, 3, s.getDataRange().getLastRow() - 1, 1);
    updatenamecelldataVal(valrange, ss);
  }
}

function updatenamecelldataVal(valrange, ss) {
  var sheets = ss.getSheets(), namecell;
  var numsheets = sheets.length; //SpreadsheetApp.getActiveSpreadsheet().getNumSheets();
  var rule = SpreadsheetApp.newDataValidation().requireValueInRange(valrange).build();
  for(var i = 0; i < numsheets; i++) {
    var sheetname = sheets[i].getName();
    var sheetrange = sheets[i].getDataRange();
    var sheetlastrow = 17; //sheetrange.getLastRow();
    if(sheetname !== 'Teacher Details' && sheetname !== 'Aggregates' && sheetname !== 'List of Subjects') {
      for(var j = 0, len = sheetlastrow / 17; j < len; j++) {
        namecell = sheetrange.getCell(4 + (17 * j), 2);
        namecell.clearDataValidations();
        namecell.setDataValidation(rule); 
      }
    }
  }
}
于 2013-10-27T03:39:16.277 に答える
0

これは、私が問題を抱えていた wchiquito のスクリプトのより単純なバージョンです。質問者のコードと正確には一致しませんが、理解しやすく、適応しやすいはずです。

function onChange(e) {

  var ss = e.source, valrange;
  var s = ss.getActiveSheet();
  var sname = s.getSheetName();

  if((e.changeType === 'INSERT_ROW' || e.changeType === 'REMOVE_ROW') && sname === 'Accounts') {
    valrange = s.getRange(2, 1, s.getMaxRows()-1, 1);
    updatenamecelldataVal(valrange, ss);
  }
}

function updatenamecelldataVal(valrange, ss) {
  var sheets = ss.getSheets();
  var targetCells;
  var rule = SpreadsheetApp.newDataValidation().requireValueInRange(valrange).build();
  for(var i = 0; i <= sheets.length; i++) {
    var sheetname = sheets[i].getName();
    if (sheetname !== 'Accounts') {
      targetCells = sheets[i].getRange(2, 1, sheets[i].getMaxRows(), 1);
      targetCells.clearDataValidations();
      targetCells.setDataValidation(rule);
    }
  }
}
于 2014-09-04T08:15:39.643 に答える