【问题标题】:Google Apps Script: Reading Duration values is off by X minutesGoogle Apps 脚本:读取持续时间值关闭 X 分钟
【发布时间】:2021-02-10 23:25:44
【问题描述】:

我正在使用我所在时区的 Google 电子表格中的持续时间字段

这是我正在使用的数据和电子表格配置的示例

样本数据:

actividadID destinoID atractivoID actividadDescripc actividadDuracion actividadTipo
da839da6 ae4f25ff '46432440 Visita 1:00:00 a. m. Específica

脚本目标

我们的想法是遍历这些字段的子集,以便我获取电子表格的所有值并过滤它们:

function TourDuration(tourID, mySS) {
  const touractivData = mySS.getSheetByName("TourActividad").getDataRange().getValues();
  const activData = mySS.getSheetByName("Actividad").getDataRange().getValues();

  var current_activList = touractivData.filter(function(item){
    return item[1] == tourID; //Match Bot Numbers && Unprocessed trades
  });
  Logger.log("current_activList:");
  Logger.log(current_activList);

当我检查我正在抓取的数据的结果时,我看到数据关闭,不仅按小时而且按分钟变为负数:

[da839da6, ae4f25ff, 46432440, Visita a la Plaza Mayor de Lima, Sat 12 月 30 日 01:08:36 GMT-05:00 1899, Específica]

(这个应该相当于1小时,但我得到的是负时间)

我的目标是将与我的过滤器匹配的所有持续时间添加到一个合并的持续时间中,但没有成功。

这里是完整的代码:

function TourDuration(tourID, mySS) {
  const touractivData = mySS.getSheetByName("TourActividad").getDataRange().getValues();
  const activData = mySS.getSheetByName("Actividad").getDataRange().getValues();

  var current_activList = touractivData.filter(function(item){
    return item[1] == tourID; //Match Bot Numbers && Unprocessed trades
  });

  var current_activList_length = current_activList.length;
  var total_duration = 0;

  for(var i = 0; i < current_activList_length; i++){

    var activDuration = activData.filter(function(item){
      return item[0] == current_activList[i][2]; //Match Bot Numbers && Unprocessed trades
    });

    var duration = Utilities.formatDate(new Date(activDuration[0][4]), "GTM-5", "dd/MM/yyyy HH:mm");
    var dur2 = new Date(activDuration[0][4]).toString().substr(25,6)+":00";
    dateString = Utilities.formatDate(activDuration[0][4], dur2, "MM/dd/yyyy HH:mm:ss");
    Logger.log(duration)
    Logger.log(dur2)
    Logger.log(dateString)
        
    total_duration = total_duration;
  }
  
  
}

这是一个持续时间为 45 分钟的寄存器的日志结果:

会不会是 App Script 界面有不同的时区? 虽然分钟差异很难解释,因为差异通常以整小时为单位。

另外,我不打算使用 getDisplayValue(),因为我需要查阅整个工作表,而 getDataRange() 会更有效。

【问题讨论】:

  • docs.google.com/spreadsheets/d/… 值得一提的是,这是在 onChange 触发器上运行的,您需要通过运行函数 createSpreadsheetChangeTrigger 来设置它。之后从 TourActividad 复制任何行并将其粘贴到最后将复制此场景
  • I don't plan on using getDisplayValue() since I need to consult the whole sheet and getDataRange() 这没有意义。使用getDisplayValues 代替getValues,而不是getDataRange()......
  • 大概,这就是发帖的目的。我会检查一下,谢谢

标签: javascript date google-apps-script


【解决方案1】:

解释:

另外,我不打算使用getDisplayValue(),因为我需要 查阅整张表格,getDataRange() 会更有效。

getDisplayValues 用于代替getValues(),其目的是获取工作表中显示的值。

更多详情请参考这篇文章:


另一方面,getDataRange() 并不是一个复杂的函数。

这个表达式:

const activSheet = mySS.getSheetByName("Actividad");
const activData = activSheet.getDataRange().getValues();

与此相同:

const activSheet = mySS.getSheetByName("Actividad");
const activData = activSheet.getRange(1,1,activSheet.getLastRow(),
                  activSheet.getLastColumn()).getValues();

走向解决方案:

通过使用getDisplayValues,您将能够获得工作表中显示的值:

function TourDuration() {
  const mySS = SpreadsheetApp.getActive();
  const activSheet = mySS.getSheetByName("Actividad");
  const activData = activSheet.getDataRange().getDisplayValues();
  console.log(activData[1][4]); // 1:00:00
}

但是,您不能从此表达式中获取完整日期,因为单元格中未指定日期。如果您扩展将 E 列中单元格的格式更改为date

您将看到您获得的正是存储在单元格中的信息。所以代码按预期工作。该问题与工作表本身缺少信息有关。

您需要在工作表中存储正确的日期:

然后,如果您将格式改回时间,日期仍然是正确的,并且您当前的脚本将能够正确获取它。

【讨论】:

  • 谢谢,获得 DisplayValue 是一种更好的方法。有了这个,我只是继续使用 split(":") 来获取小时和分钟并在内部计算总持续时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多