例如,我需要计算下拉菜单发生更改时发生更改的下拉菜单的发生次数 苹果 橘子 苹果 葡萄 苹果 橘子 橘子 苹果 橘子
4个苹果,4个橙子,1个葡萄
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;
}