【问题标题】:Handling time duration in Google Sheets Api在 Google Sheets Api 中处理持续时间
【发布时间】:2014-09-25 19:31:27
【问题描述】:

我正在制作一个基本脚本,它从外部工作表中获取持续时间,并将它们相加。到目前为止我所拥有的是:

function getHorasCasoUso() {
  var libros = {
    "key1" : "externalSheetURL1",
    "key2" : "externalSheetURL2",
    ...
  };

  var horas_por_caso_uso = {};

  for (var key in libros) {
    var libro = SpreadsheetApp.openByUrl(libros[key]);
    var sheets = libro.getSheets();
    for (var i = 0; i < sheets.length; i++) {
      var sheet = sheets[i];
      var rows = sheet.getDataRange();
      var numRows = rows.getNumRows();
      var values = rows.getValues();

      for (var j = 5; j < numRows; j++) {
        var row = values[j];
        var caso_uso = row[6];
        var horas = row[4]; //The cell format is 'Duration'       

        if (!caso_uso)
          continue;

        if (!!horas_por_caso_uso[caso_uso])
          horas_por_caso_uso[caso_uso] += horas;
        else
          horas_por_caso_uso[caso_uso] = horas;
      }
    }
  }

  var ss = SpreadsheetApp.getActiveSheet();
  for (var key in horas_por_caso_uso) {
    ss.appendRow([key, horas_por_caso_uso[key]]);
  }

}

问题是 'horas' 中存储的数据是一个字符串。我想获得该单元格中的持续时间。我该怎么做?

【问题讨论】:

    标签: google-apps-script google-drive-api google-sheets


    【解决方案1】:

    您的问题似乎与this post 中的问题非常相似,但规模更大......

    您应该将row[4] 值转换为分钟(或秒,如果您需要此精度),然后将该值添加到总计数器。

    如果单元格被格式化为持续时间(如您所说),它应该无需更改即可工作。(请参阅本文末尾的代码)

    如果不是,即如果这些值作为字符串返回,那么一个简单的字符串操作将为您完成这项工作:

    示例:testString = 12:34

    function toMinutes(value){
      var minutes = Number(value.split(':')[0].replace(' ',''))*60+Number(value.split(':')[1].replace(' ',''));
      return minutes;
    }
    

    (作为函数工作的代码)将返回 754 (60*12+34)

    在您的代码中使用:var horas = toMinutes(row[4]);

    function toMinutes(value){
      var duration = new Date(value);
      var min = duration.getMinutes()+60*duration.getHours();
      return min;
    }
    

    您最终可以使用一些错误捕获功能来改进此功能,以处理单元格没有格式错误的情况...由于我不知道数据是什么样的,我更喜欢让您自己做。

    【讨论】:

    • 感谢您的回复。除此之外,我必须小心时区。例如,其中一个电子表格的值为“0:45:00”,但当我检查行 [4] 处的相应值时,我得到“Sat Dec 30 1899 02:01:48 GMT-0300 (UYT)” . toMinutes 返回 121。另一方面,如果我将电子表格中的单元格格式更改为日期时间,它会显示 12/30/1899 0:45:00。显然这里的问题是 new Date(row[4]) 返回乌拉圭时间的日期,因为我来自乌拉圭。
    • 这确实会更棘手......也许强制它成为字符串并使用我建议的解析功能会更可靠,或者至少更简单! - 顺便说一句,谢谢接受。另请参阅这篇文章,如果您尝试使用日期方法可能会有所帮助:stackoverflow.com/questions/17715841/…
    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2017-02-11
    相关资源
    最近更新 更多