Поиск в таблице для строки и вернуть частичные данные строки - PullRequest
0 голосов
/ 09 ноября 2018

Привет сообщество stackoverflow,

Я хочу создать скрипт для поиска по листу Google по имени, так как этот файл будет удален в конце скрипта. Новый файл будет загружаться на Google Drive автоматически каждую неделю. Это будет основой для скрипта, который будет запускаться еженедельно.

Код работает нормально, но в 4 выходных ячейках возвращается неопределенное значение.

Пример данных из строки в электронной таблице "LocafoxInventoryData_Automatic":

1 || 5b8ff4fc3e578c005487dcd5 | 60,0000 | 38,6300 | 19,0000 ||| 2,0000

Я хотел бы получить последнее число в приведенной выше строке. (после последнего "|")

Я надеюсь, что кто-нибудь может мне помочь. Поиск искомых строк - это идентификаторы продуктов: в приведенном выше примере "5b8ff4fc3e578c005487dcd5". Этот идентификатор можно найти только два раза в листе. Я хочу всегда получить первый. Разница между первым и вторым идентификаторами продукта заключается в первом числе в строке. Есть "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 голосов
/ 20 декабря 2018

Возвращение данных частичной строки с помощью регулярного выражения

Хорошо, это работает для меня. У меня есть файл с именем «LocafoxInventoryData_Automatic», который представляет собой электронную таблицу с одним листом. Я ищу файлы с таким именем и, если найдено более одного, выдает ошибку, чтобы вы могли выяснить, какой вы хотите.

Затем я открываю файл как SpreadSheet с openById. Я получаю идентификатор продукта из столбца листа Vorlage I7,8,9,10 и оборачиваю их регулярным выражением, которое выглядит следующим образом: ^ 1 \ | \ | cw8vtfxa5owglp03btv22g9d. \ | \ | \ | (. ) $. Хотя в коде обратная косая черта \ должна быть \\ двойной обратной косой чертой, что потребовало некоторого времени, чтобы выяснить.

Итак, в конце получаем числа, и я помещаю их в столбец Vorlage D7,8,9,10. И тогда я установил для файла isTrashed значение true. Я не знаю, хотите ли вы вернуть данные, поэтому я оставил объект там, но закомментировал их. Я также удалил все остальное, если.

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;
  } 
}

Между прочим, для решения этой проблемы весьма полезно иметь собственный тестер регулярных выражений, написанный на том же языке, на котором вы разрабатываете. Извините, это заняло у меня так много времени. Если у вас возникнут дополнительные проблемы, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...