首页 > 解决方案 > Google Apps 脚本:读取持续时间值已关闭 X 分钟

问题描述

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

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

在此处输入图像描述 在此处输入图像描述

样本数据:

激活ID 目的地ID 苍术ID 激活描述 激活持续时间 actividadTipo
da839da6 ae4f25ff '46432440 参观 凌晨 1:00:00 特殊的

脚本目标

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

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 Dec 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() 会更有效。

标签: javascriptdategoogle-apps-script

解决方案


解释:

另外,我不打算使用,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

在此处输入图像描述

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

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

在此处输入图像描述

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


推荐阅读