在电子表格中搜索字符串并返回部分行数据

时间:2018-11-09 11:47:12

标签: javascript google-apps-script

Hello stackoverflow社区,

我想创建一个脚本来按名称搜索Google工作表,因为此文件将在脚本末尾删除。一个新文件将每周自动上载到Google Drive。这将成为每周运行的脚本的基础。

代码运行正常,但在4个输出单元格中返回undefined。

电子表格“ LocafoxInventoryData_Automatic”中一行的示例数据:

1 || 5b8ff4fc3e578c005487dcd5 | 60.0000 | 38.6300 | 19.0000 ||| 2.0000

我想检索上述字符串中的最后一个数字。 (在最后一个“ |”之后)

我希望有人能帮助我。搜索的字符串是产品的ID:在上面的示例“ 5b8ff4fc3e578c005487dcd5”中。该ID在工作表中只能找到两次。我想始终检索第一个。第一产品ID和第二产品ID之间的差异是字符串中的第一个数字。有“ 1”和“ 2”。

function getData() {
var files = DriveApp.getFilesByName('LocafoxInventoryData_Automatic');
  while (files.hasNext()) {
  var file = files.next();
  var id = file.getId()
  }
    var sheetData = SpreadsheetApp.openById(id).getActiveSheet().getDataRange().getValues();
    var sspre = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Vorlage");
    var searchString1 = sspre.getRange('I7').getValue();
    var searchString2 = sspre.getRange('I8').getValue();
    var searchString3 = sspre.getRange('I9').getValue();
    var searchString4 = sspre.getRange('I10').getValue();

    for(var i=0;i<sheetData;i++)
    {
    //Column 1 should be searched
    if(sheetData[i][0].search(searchString1)!=-1)
    {
    var rowData1 = sheetData[i];
    return rowData1;
    }
    else if(sheetData[i][0].search(searchString2)!=-1)
    {
    var rowData2 = sheetData[i];
    return rowData2;
    }
    else if(sheetData[i][0].search(searchString3)!=-1)
    {
    var rowData3 = sheetData[i];
    return rowData3;
    }
    else if(sheetData[i][0].search(searchString4)!=-1)
    {
    var rowData4 = sheetData[i];
    return rowData4;
    }
  }
sspre.getRange('D7').setValue(rowData1);
sspre.getRange('D8').setValue(rowData2);
sspre.getRange('D9').setValue(rowData3);
sspre.getRange('D10').setValue(rowData4);
file.setTrashed(true);
}

1 个答案:

答案 0 :(得分:0)

使用正则表达式返回部分行数据

好的,这对我有用。我有一个名为“ LocafoxInventoryData_Automatic”的文件,它是一个包含一张纸的电子表格。我会寻找具有该名称的文件,如果发现多个文件,则会抛出错误,以便您找出想要的文件。

然后我使用openById将其作为SpreadSheet打开。我从“工作表”列I7、8、9、10中获得了产品ID,并使用正则表达式将它们包装起来,该正则表达式如下所示:^ 1 \ | \ | cw8vtfxa5owglp03btv22g9d。 \ | \ | \ |(.. )$。尽管在代码中反斜杠\必须是\\双反斜杠,这花了我一段时间才能弄清楚。

所以这是最后的数字,我将它们放入Vorlage列D7,8,9,10中。然后我将文件isTrashed设置为true。我不知道您是否要返回数据,所以我将对象留在那里,但将其注释掉。我还删除了所有其他ifs。

function getData() {
  var filename='LocafoxInventoryData_Automatic';
  var files = DriveApp.getFilesByName(filename);
  var n=0;
  while (files.hasNext()) {
    var file = files.next();
    var id = file.getId();
    n++;
  }
  if(n>1){throw(Utilities.formatString('Error: More than file named %s', filename));}//Will present an error if there is more than one file
  if(id){
    var sheetData = SpreadsheetApp.openById(id).getActiveSheet().getDataRange().getValues();//I assumed no headers in this file
    var sspre = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Vorlage");
    var re1 = new RegExp('^1\\|\\|' + sspre.getRange('I7').getValue() + '.*\\|\\|\\|(.*)$','i');
    var re2 = new RegExp('^1\\|\\|' + sspre.getRange('I8').getValue() + '.*\\|\\|\\|(.*)$','i');
    var re3 = new RegExp('^1\\|\\|' + sspre.getRange('I9').getValue() + '.*\\|\\|\\|(.*)$','i');
    var re4 = new RegExp('^1\\|\\|' + sspre.getRange('I10').getValue() + '.*\\|\\|\\|(.*$)','i');
    for(var i=0;i<sheetData.length;i++){
      var rD1=re1.exec(sheetData[i][0]); 
      if(rD1) {
        var rowData1 = rD1[1];
      }
      var rD2=re2.exec(sheetData[i][0]);
      if(rD2) {
        var rowData2 = rD2[1];
      }
      var rD3=re3.exec(sheetData[i][0]);
      if(rD3) {
        var rowData3 = rD3[1];
      }
      var rD4=re4.exec(sheetData[i][0]);
      if(rD4) {
        var rowData4 = rD4[1];
      }
    }
    //var rObj={rowData1:rowData1,rowData2:rowData2,rowData3:rowData3,rowData4:rowData4};
    sspre.getRange('D7').setValue(rowData1);
    sspre.getRange('D8').setValue(rowData2);
    sspre.getRange('D9').setValue(rowData3);
    sspre.getRange('D10').setValue(rowData4);
    file.setTrashed(true);
    //return rObj;
  } 
}

用某种碰巧用您开发时使用的语言编写自己的regex测试器对某种问题很有帮助。很抱歉,我花了这么长时间。如果您遇到其他问题,请告诉我。