Подсчитать выпадающие - PullRequest
0 голосов
/ 10 ноября 2019

Мне нужно подсчитать количество выпадающих выпадений, которые меняются при изменении выпадающих, например, яблочных апельсинов, яблок, яблок, апельсинов, апельсинов, яблок и апельсинов

4 яблока, 4 апельсина, 1 виноград

1 Ответ

1 голос
/ 10 ноября 2019

Триггер onEdit () срабатывает только тогда, когда пользователь вносит изменения. Так что, если ваша функция onEdit () нацелена на диапазон, который имеет валидацию, то любой возникающий триггер указывает на изменение. Так что посчитай их. Вы можете сохранить счет на другом листе или, возможно, даже в PropertiesService. В зависимости от того, как вы на них нацеливаетесь, вы можете хранить их в ключах свойств, которые отражают их диапазон.

Вот простой пример устанавливаемого onEdit (), который проверяет изменения в ячейках, которые имеют критерии правила проверки VALUE_IN_LIST или VALUE_IN_RANGE.

function onMyEdit(e) {
  var sh=e.range.getSheet();
  //e.source.toast('Got Trigger');
  if(sh.getName()!="Sheet1")return;
  checkForValidations(e);
}

function onOpen() {
  SpreadsheetApp.getUi().createMenu('My Menu')
  .addItem('Display Counts', 'displayScriptProperties')
  .addItem('Create Installable Trigger', 'createTrigger')
  .addItem('Remove All Properties','removeAllScriptProperties') 
  .addToUi();
}


function checkForValidations(e) {
  //e.source.toast('Checking');
  var rg=e.range;
  var sh=e.range.getSheet();
  var row=e.range.rowStart;
  var col=e.range.columnStart;
  var vA=rg.getDataValidations();
  var ps=PropertiesService.getScriptProperties();
  for(var i=0;i<vA.length;i++) {
    for(var j=0;j<vA[i].length;j++) {
      var rule=vA[i][j];
      if(rule!=null) {
        var criteria = rule.getCriteriaType();
        if(criteria==SpreadsheetApp.DataValidationCriteria.VALUE_IN_LIST || criteria==SpreadsheetApp.DataValidationCriteria.VALUE_IN_RANGE) {
          var loc=Utilities.formatString('%s', sh.getRange(i+row,j+col).getA1Notation());
          e.source.toast(loc);//you can remove this
          if(ps.getProperty(loc)) {
            ps.setProperty(loc,parseInt(ps.getProperty(loc))+1);
          }else{
            ps.setProperty(loc,1);
          }
        }
      }
    }
  }  
}

function displayScriptProperties() {
  var ps=PropertiesService.getScriptProperties();
  var lObj=ps.getProperties();
  var html="";
  for(var key in lObj) {
    html+='<br />' + key + ' = ' + lObj[key];
  }
  var userInterface=HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "Script Properties");
}

function createTrigger() {
  if(!isTrigger('onMyEdit')) {
    ScriptApp.newTrigger('onMyEdit').forSpreadsheet(SpreadsheetApp.getActive()).onEdit().create();
  }
}

function isTrigger(funcName){//prevents multiple triggers from being created
  var r=false;
  if(funcName){
    var allTriggers=ScriptApp.getProjectTriggers();
    for(var i=0;i<allTriggers.length;i++){
      if(funcName==allTriggers[i].getHandlerFunction()){
        r=true;
        break;
      }
    }
  }
  return r;
}

function removeAllScriptProperties() {
  var resp=SpreadsheetApp.getUi().alert("Are you sure that you wish to delete ALL SCRIPT Properties?", SpreadsheetApp.getUi().ButtonSet.YES_NO)
  if(resp==SpreadsheetApp.getUi().Button.YES) {
    var ps=PropertiesService.getScriptProperties();
    ps.deleteAllProperties();
  }
  return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...