Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于脚本的数据验证未获取所有值(表)_Javascript_Google Sheets - Fatal编程技术网

Javascript 基于脚本的数据验证未获取所有值(表)

Javascript 基于脚本的数据验证未获取所有值(表),javascript,google-sheets,Javascript,Google Sheets,这段代码正在工作,尽管我不记得在结构方面做了任何更改,但它部分停止了工作。 一旦我在单元格W4上选择了一个项目,它显然只给了我C列中与该项目相关的另一张表中的第一个选项,而下拉列表应该有大约04个项目。我找不到缺陷在哪里: function onEdit(){ var tabLists = "ArquivoItens"; var tabValidation = "EditarItem"; var ss = SpreadsheetApp.getActiveSpreadsheet().g

这段代码正在工作,尽管我不记得在结构方面做了任何更改,但它部分停止了工作。 一旦我在单元格W4上选择了一个项目,它显然只给了我C列中与该项目相关的另一张表中的第一个选项,而下拉列表应该有大约04个项目。我找不到缺陷在哪里:

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
需要一个字符串,而不是数组。