【问题标题】:Google Apps Scripts If function not skipping rows with null valueGoogle Apps Scripts If 函数不跳过空值的行
【发布时间】:2020-04-02 13:27:34
【问题描述】:

我正在编写一个函数,它将在电子表格中搜索员工工作时间的天数,创建一个包含工作编号、工作名称、员工姓名、小时数和日期的值的数组,然后将它们放到另一个电子表格中。它还只显示过去 8 天内的小时数,以便在我们必须报告小时数的一周内计算出时间(我将其安排为在到期日运行)。我也一直在过滤掉空白时间的日子,这限制了被复制的数据量。

我遇到了一个问题,一名员工跳过空白时间的功能不起作用。对于其他员工,我已经能够使用“”来表示一个空单元格。我也尝试使用 (null) 作为一个值,但这只会忽略 7 天中的 6 天(它仍然记录没有与计算一周中小时数的单元格相邻的小时数的天数)。

我不明白为什么这不适用于整个 Google 表格文档中的 一个 表格。我已经简化了我的电子表格以减少个人信息,并使解析脚本更容易,但在我的原始文档中,我跟踪了 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();
}

【问题讨论】:

  • 哪个显示问题?
  • Stephen 的行没有跳过没有时间的日期。
  • @StephenSchonewolf 你检查过脚本中dailyhours 的值吗?通过调试器运行或记录值及其类型?另外,我知道您发布的脚本已被删减,但使用高级表格服务而不是标准服务是否有特殊原因?
  • 好的,我现在看到了问题。是否有任何特殊原因需要您使用高级 API 而不是内置在一个 SpreadsheetApp 中?更改代码以使用内置服务时,它会按预期工作。
  • @Diego 我运行了“每日时间”的日志。它将值设为空...除了周期中的第 7 天,该单元格旁边的单元格将过去 7 天添加为每周总计。我使用高级表格纯粹是出于习惯,因为那是我大约一年前发现使用行迭代器的第一个示例的地方。我一直在尝试以其他方式做到这一点,但没有成功。在脚本的其余部分,我还从许多谷歌表格中提取数据并创建一个数组,为其他员工提供工作#、小时数等。

标签: if-statement google-apps-script google-sheets null iterator


【解决方案1】:

我不确定确切的问题,但检查具有值的单元格而不是不为空的单元格应该适合您。

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 个工作表中抓取数据,那么另一个循环和工作表名称数组将节省重复代码

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

【讨论】:

  • 这绝对会有所作为!我认为我对不为空或不为空的值挂断的部分原因是因为与其他一些员工一起,我必须确保不同的列不是正确显示的特定值。我将尝试使用内置服务清理较长版本的代码,看看这是否对整体有所帮助。
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多