Сценарии Google Apps Если функция не пропускает строки с нулевым значением - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу функцию, которая будет выполнять поиск в электронной таблице дней, в течение которых сотрудник отработал часы, создаст массив со значениями для номера работы, имени работы, имени сотрудника, часов и даты, а затем поместит их в другую электронную таблицу. Он также показывает только часы, которые были в течение последних 8 дней, чтобы можно было рассчитать время для недели, когда мы должны сообщать о часах (я планирую запустить дневное время). Я также отфильтровал дни с пустыми часами, что ограничивает объем копируемых данных.

Я столкнулся с проблемой, когда на одном сотруднике не работает функция пропуска пустых часов. Для других сотрудников я смог использовать «» для обозначения пустой ячейки. Я также пытался использовать (null) в качестве значения, но он игнорирует только 6 из 7 дней (он по-прежнему регистрирует дни без часов, которые соседствуют с ячейками, которые рассчитывают часы в неделе).

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

https://docs.google.com/spreadsheets/d/1ve0EPVQJ2vmWG1NYHMncw1ZljP3yXd28dMeNC38Jiy4/edit?usp=sharing

Ссылка на электронную таблицу. Код ниже.

function shoptime(){
  var ss = SpreadsheetApp.getActive().getId();
  var stephensheet = Sheets.Spreadsheets.Values.get(ss, 'Stephen!A2:G');
  var tiffanysheet = Sheets.Spreadsheets.Values.get(ss, 'Tiffany!A2:G');
  var scripts = SpreadsheetApp.getActive().getSheetByName("Scripts");
  var currentDate = new Date();
  var pastweek = new Date();
  pastweek.setDate(currentDate.getDate() -8);

var array=[];

  for (var a = 0; a < stephensheet.values.length; a++){
  var jobdate = stephensheet.values[a][1];
  var intime = stephensheet.values[a][2];
  var outtime = stephensheet.values[a][3];
  var dailyhours = stephensheet.values[a][4];

  if (new Date(jobdate) > pastweek){
      if (dailyhours != (null)){
      array.push(["NA","Office","Stephen",dailyhours,jobdate]);
    }
  }
 }
  for (var a = 0; a < tiffanysheet.values.length; a++){
  var jobdate = tiffanysheet.values[a][1];
  var intime = tiffanysheet.values[a][2];
  var outtime = tiffanysheet.values[a][3];
  var dailyhours = tiffanysheet.values[a][4];

  if (new Date(jobdate) > pastweek){
      if (dailyhours != ("")){
      array.push(["NA","Office","Tiffany",dailyhours,jobdate]);
    }
  }
 }
  if(array[0]){
    scripts.getRange(scripts.getLastRow()+1,1,array.length,5).setValues(array);  
    }
  SpreadsheetApp.flush();
}

1 Ответ

0 голосов
/ 02 апреля 2020

Я не уверен в точной проблеме, но проверка ячеек, которые имеют значение, а не ячеек, которые не являются нулевыми, должна работать для вас.

function shoptime(){
      var ss = SpreadsheetApp.getActive().getId();
      var stephensheet = Sheets.Spreadsheets.Values.get(ss, 'Stephen!A2:G');
      var tiffanysheet = Sheets.Spreadsheets.Values.get(ss, 'Tiffany!A2:G');
      var scripts = SpreadsheetApp.getActive().getSheetByName("Scripts");
      var currentDate = new Date();
      var pastweek = new Date();
      pastweek.setDate(currentDate.getDate() -8);

    var array=[];

      for (var a = 0; a < stephensheet.values.length; a++){
      var jobdate = stephensheet.values[a][1];
      var intime = stephensheet.values[a][2];
      var outtime = stephensheet.values[a][3];
      var dailyhours = stephensheet.values[a][4];

      if (new Date(jobdate) > pastweek){
          if (dailyhours){
          array.push(["NA","Office","Stephen",dailyhours,jobdate]);
        }
      }
     }
      for (var a = 0; a < tiffanysheet.values.length; a++){
      var jobdate = tiffanysheet.values[a][1];
      var intime = tiffanysheet.values[a][2];
      var outtime = tiffanysheet.values[a][3];
      var dailyhours = tiffanysheet.values[a][4];

      if (new Date(jobdate) > pastweek){
          if (dailyhours){
          array.push(["NA","Office","Tiffany",dailyhours,jobdate]);
        }
      }
     }
      if(array[0]){
        scripts.getRange(scripts.getLastRow()+1,1,array.length,5).setValues(array);  
        }
      SpreadsheetApp.flush();
    }

И изменить код для использования встроенного -в работе с намного проще в этом случае;

function shoptime(){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var stephensheet =  ss.getSheetByName('Stephen').getDataRange().getValues();
      var tiffanysheet = ss.getSheetByName('Tiffany').getDataRange().getValues();
      var scripts = ss.getSheetByName("Scripts");
      var currentDate = new Date();
      var pastweek = new Date();
      pastweek.setDate(currentDate.getDate() -8);

        var array=[];

          for (var a = 0; a < stephensheet.length; a++){
          var jobdate = stephensheet[a][1];
          var intime = stephensheet[a][2];
          var outtime = stephensheet[a][3];
          var dailyhours = stephensheet[a][4];

          if (new Date(jobdate) > pastweek){
              if (dailyhours != ""){
              array.push(["NA","Office","Stephen",dailyhours,jobdate]);
            }
          }
         }
          for (var a = 0; a < tiffanysheet.length; a++){
          var jobdate = tiffanysheet[a][1];
          var intime = tiffanysheet[a][2];
          var outtime = tiffanysheet[a][3];
          var dailyhours = tiffanysheet[a][4];

          if (new Date(jobdate) > pastweek){
              if (dailyhours != ""){
              array.push(["NA","Office","Tiffany",dailyhours,jobdate]);
            }
          }
         }
         if(array[0]){
           scripts.getRange(scripts.getLastRow()+1,1,array.length,5).setValues(array);  
           }
      SpreadsheetApp.flush();
    }

Наконец, если вы копируете данные с 6 листов в точно таком же формате, тогда еще один l oop и массив листа имена сэкономят при повторении кода

        function shoptime() {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheets = ['Stephen', 'Tiffany'] // add the aditional sheet names here
        var scripts = SpreadsheetApp.getActive().getSheetByName("Scripts");
        var currentDate = new Date();
        var pastweek = new Date();
        pastweek.setDate(currentDate.getDate() - 8);

        var array = [];

        for (var i = 0; i < sheets.length; i++) {
            var sheet = ss.getSheetByName(sheets[i]);
            var data = sheet.getDataRange().getValues();

            for (var a = 0; a < data.length; a++) {
                var jobdate = data[a][1];
                var intime = data[a][2];
                var outtime = data[a][3];
                var dailyhours = data[a][4];

                if (new Date(jobdate) > pastweek) {
                    if (dailyhours) {
                        array.push(["NA", "Office", sheets[i], dailyhours, jobdate]);
                    }
                }
            }
        }

        if (array[0]) {
            scripts.getRange(scripts.getLastRow() + 1, 1, array.length, 5).setValues(array);
        }
        SpreadsheetApp.flush();
    }
...