如何获得两列等于特定值的行

时间:2019-05-09 19:38:13

标签: google-apps-script google-sheets google-apps-script-editor

我很新,我正在尝试创建一个Time in / Time out表。我有2个单独的工作表,first(ACTIVE)是触发onEdit(e)脚本发生的地方。启动onEdit(e)的所有功能都会影响第二个工作表(PASSIVE),以填写列A(姓),B(名字),C(位置),D(超时)。我通过获取A,B,C +活动行(这不是代码)的值来完成超时功能。触发器始终与要复制的值位于同一行,因此相对简单。在PASSIVE工作表上,所有值都使用称为addRecord的代码存储,该代码获取PASSIVE工作表的最后一行+ 1,并安装从ACTIVE工作表中获取的值并将其插入。因此,它添加记录而不会覆盖任何内容。做工精美。但是,使“时间到”功能很困难。 E(Time In)我的想法是,通过找到PASSIVE!A从(ACTIVE!A + Active Row)中获取的值来找到PASSIVE!A的行,找到匹配项后,便会查看(PASSIVE!E +匹配的行)是空的。如果是,它将添加new.Date并完成。如果不为空,它将忽略该行,并继续在该行中搜索下一个具有PASSIVE!A的行。找到该行后,即可获取行。 setValue of(PASSIVE!E +抓行,新的Date())

我确实在线找到了一个函数,以找到与ACTIVE!A和PASSIVE!A匹配的第一行。但是它一直覆盖第一场比赛的日期。从不忽略具有非空单元格的行到下一个匹配行。也许我刚刚离开,这就是为什么我在“答案”中要求很多详细信息和解释的原因。 这是我从另一个答案中使用的代码。

function getCurrentRow() {
  var currentRow = SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
  return currentRow;
}
function onSearch1()
{

我添加了什么

  var row = getCurrentRow();
  var activeLocation = getValue('ACTIVE!A' + row);

续其他代码

 var searchString = activeLocation;
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PASSIVE"); 
    var column =1; //column Index   
    var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
  var searchResult = columnValues.findIndex(searchString); //Row Index - 2

我添加了什么

 setValue(PASSIVE!E + searchResult, new Date().toLocaleString())

如果每个人都有不同的名字,它就可以工作,但是搜索结果总是找到匹配项的第一行,我尝试添加if if active!A == PASSIVE!A  && PASSIVE!E ==“”,grabRow(我知道这不是正确的代码),但我什至不知道如果函数运行,是否可以运行或者运行后是否只会出现错误,则将其放置在哪里第一次真实。

续其他代码

if(searchResult != -1)
    {
        //searchResult + 2 is row index.
        SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PASSIVE").setActiveRange(sheet.getRange(searchResult + 2, 1))
    }
   if(searchResult = searchResult2) {
    setValue('PASSIVE!E' + searchResult, new Date().toLocaleString())
  }
}
Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if(this[i] == search) return i;

  return -1;
}

这就是我所使用的,但是不确定这是否是正确的方法。每次使用它时,它只会将SearchResult设置为找到的第一行,如果发现最后一行,则该行实际上具有我想要的searchString,因为考虑到添加记录会随着时间的流逝而下降,并且登录应该是最新的名称。但是我想如果我能得到一个搜索范围并在特定列中找到两个值的行,那么我就可以setValue('PASSIVE!E' + foundRow, new Date().toLocaleString())

编辑5/9/2019 17:34 PST 谢谢那些回答。我正在扩大这个问题。

function rowWhereTwoColumnsEqual(value1,col1,value2,col2) {
 var value1=value1 || 'A1';//testing
 var value2=value2 || "";

我的想法是在另一张纸的Column1中搜索“ SheetA1”(第一张纸)。另一个工作表的Column3则为“”(cellisempty)。

var value1= 'Sheet1!A1';
 var value2= "";
 var col1='Sheet2!A';
 var col2='Sheet2!C';
 var ss=SpreadsheetApp.getActive();
 var sh=ss.getSheetByName('Sheet2');
 var rg=sh.getDataRange();
 var vA=rg.getValues();

但是,我不知道vA是如何工作的。我还想获取找到的Row的getRow(),以便在另一个函数中使用该数字。

1 个答案:

答案 0 :(得分:0)

尝试一下:

function rowWhereTwoColumnsEqual(value1,col1,value2,col2) {
  var value1=value1 || 9;//testing
  var value2=value2 || 8;
  var col1=col1 || 1;//testing
  var col2=col2 || 2;//testing
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i][col1-1]==value1 && vA[i][col2-1]==value2) {
      rA.push(i+1);
    }
  }
  SpreadsheetApp.getUi().alert(rA.join(','));
  //return rA;//as an array
  //return rA.join(',');//as a string
}