Javascript 基于脚本的数据验证未获取所有值(表)
这段代码正在工作,尽管我不记得在结构方面做了任何更改,但它部分停止了工作。 一旦我在单元格W4上选择了一个项目,它显然只给了我C列中与该项目相关的另一张表中的第一个选项,而下拉列表应该有大约04个项目。我找不到缺陷在哪里:Javascript 基于脚本的数据验证未获取所有值(表),javascript,google-sheets,Javascript,Google Sheets,这段代码正在工作,尽管我不记得在结构方面做了任何更改,但它部分停止了工作。 一旦我在单元格W4上选择了一个项目,它显然只给了我C列中与该项目相关的另一张表中的第一个选项,而下拉列表应该有大约04个项目。我找不到缺陷在哪里: function onEdit(){ var tabLists = "ArquivoItens"; var tabValidation = "EditarItem"; var ss = SpreadsheetApp.getActiveSpreadsheet().g
function onEdit(){
var tabLists = "ArquivoItens";
var tabValidation = "EditarItem";
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
var activeCell = ss.getActiveCell();
//It checks if the active cell is where the product name is
if(activeCell.getColumn() == 23 && activeCell.getRow() == 4 && ss.getSheetName() == tabValidation){
//if it is, it clears the Versão cell, so you can choose the ones related to the product of choice.
activeCell.offset(0, 6).clearContent().clearDataValidations();
//specifies the data range where the Product and the related field you want filtered is on
var makes = datass.getRange(2, 1, datass.getLastRow(), 3).getValues();
Logger.log(makes);
//this is what I need to study - map function
var searchArray = makes.map(function(e){return e[1];});
var makeIndex = searchArray.indexOf(activeCell.getValue());
Logger.log(searchArray);
//if anything on B (where desired column data is) is found related to A, where the product sits
if(makeIndex != -1){
//push found items to the datavalidation list
var validationRange = datass.getRange("C" + (2+makeIndex));
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
activeCell.offset(0, 6).setDataValidation(validationRule);
}
}
}
非常感谢您在学习js的同时帮助我构建所需的解决方案
干杯,indexOf()
只查找搜索键的第一个实例
如果希望activeCell.getValue()
多次出现,则需要实现一个循环,多次调用indexOf()
,或者-更简单-使用应用程序脚本方法
此外,如果感兴趣的值不包含在相邻的范围内,则不能使用requireRequireWainRange()
。改用
样本:
...
if(activeCell.getColumn() == 23 && activeCell.getRow() == 4 && ss.getSheetName() == tabValidation){
var makes = datass.getRange(2, 1, datass.getLastRow(), 3).getValues();
var validationList = [];
var searchArray = datass.getRange(2, 2, datass.getLastRow(), 1).createTextFinder(activeCell.getValue()).findAll();
for(var i = 0; i < searchArray.length; i++){
var row = searchArray[i].getRow();
var Cvalue = makes[row-1][2];
validationList.push(Cvalue);
}
if(validationList.length > 0){
var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(validationList).build();
activeCell.offset(0, 6).setDataValidation(validationRule);
}
}
...
。。。
如果(activeCell.getColumn()==23&&activeCell.getRow()==4&&ss.getSheetName()==tabValidation){
var makes=datass.getRange(2,1,datass.getLastRow(),3).getValues();
var validationList=[];
var searchArray=datass.getRange(2,2,datass.getLastRow(),1).createTextFinder(activeCell.getValue()).findAll();
对于(var i=0;i0){
var validationRule=SpreadsheetApp.newDataValidation().requireRewageInList(validationList.build();
activeCell.offset(0,6).setDataValidation(validationRule);
}
}
...
我有限的知识不允许我使用高级脚本,所以我寻找了另一种方法,下面是我如何让它工作的:
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ArquivoItens");
var versionList = new Array();
var activeCell = ss.getActiveCell();
if(activeCell.getColumn() == 23 && activeCell.getRow() == 4 && ss.getSheetName() == "EditarItem"){
activeCell.offset(0, 6).clearContent().clearDataValidations();
var dataRng = dataSheet.getSheetValues(2, 2, dataSheet.getLastRow(), 2);
for (var i = 0; i < dataRng.length; i++){
if(dataRng[i].indexOf(activeCell.getValue())!=-1){
versionList.push(dataRng[i][1])
}
}
var validation = SpreadsheetApp.newDataValidation();
validation.setAllowInvalid(false);
validation.requireValueInList(versionList, true);
activeCell.offset(0, 6).setDataValidation(validation.build());
}
}
函数onEdit(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=SpreadsheetApp.getActiveSheet();
var数据表=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“ArquivoItens”);
var versionList=新数组();
var activeCell=ss.getActiveCell();
如果(activeCell.getColumn()==23&&activeCell.getRow()==4&&ss.getSheetName()==EditarItem){
activeCell.offset(0,6).clearContent().clearDataValidations();
var dataRng=dataSheet.getSheetValues(2,2,dataSheet.getLastRow(),2);
对于(变量i=0;i
非常感谢你的帮助 实际上,脚本将在同一行的C列中为您提供数据验证值,在该行中找到
activeCell
值的第一个实例。如果你想有四个值,那么其他三个值应该来自哪里?activeCell
的值是否在列A中包含多次?正确,@ziganotschka!A列中的值被重复,C列中有不同的“版本”。然后,目标是能够选择哪个版本。TextFinder()和/或findAll()显然要求将其添加到appsscript.json文件:“oauthScopes”:[“”,“”],它再次请求授权,但我一直只得到与W4相关的第一个选项,当我尝试直接从应用程序脚本运行代码时,它说工作表无法使用代码访问文档,并给我电子表格ID。它仍然给出此错误:异常:服务电子表格在访问ID为的文档时失败…TextFinder()不需要手动将作用域添加到清单中-在您尝试手动运行代码一次后,它将提示您输入正确的作用域本身。根据代码的其余部分,您可能需要其他作用域。如果您不确定,最好从手稿中删除作用域,让脚本通过运行它来获取它们。它在访问工作表时不断给我错误,并将我指向以下行:var searchArray=datass.getRange(2,2,datass.getLastRow(),1)。createTextFinder(activeCell.getValues()).findAll();有什么想法吗?它应该是getValue()
,而不是getValues()
,因为后者会从一个值范围返回一个2D值数组,而TextFinder
需要一个字符串,而不是数组。