【问题标题】:How to join date and time values into datetime and set it to a cell?如何将日期和时间值加入日期时间并将其设置为单元格?
【发布时间】:2020-08-14 01:47:42
【问题描述】:

我想连接两个单元格值。示例:

单元格日期的值:2020 年 5 月 11 日。单元格时间的值:14:00。最终细胞 应该是:2020-05-11 14:00:00。

我这样做的方式是:

sheetDestination.getRange(9,7).setValue(shiftDate + shiftTime);

输出结果是:

2020 年 5 月 11 日星期一 00:00:00 GMT-0400(东部夏令时间)范围。

function shiftDuration () {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheetDestination = spreadsheet.getSheetByName("NewToImport");
  
    //Time Diff
    var timeStartforShift = sheetDestination.getRange(2, 4).getDisplayValue(); //start time
    var timeEndforShift = sheetDestination.getRange(5, 5).getDisplayValue(); //end time
    var shiftDuration = Math.floor(parseInt(timeEndforShift) - parseInt(timeStartforShift)); 
  
    //create a new row to test concatenating date and time
    var rangeDurantionToCopy = sheetDestination.getRange(1, 1, 2, 
    sheetDestination.getMaxColumns());
    rangeDurantionToCopy.copyTo(sheetDestination.getRange(8,1));
    var shiftEndTime = sheetDestination.getRange(9,5).setValue(timeStartforShift + (shiftDuration * 60));
    var shiftDate = sheetDestination.getRange(9,3).getValue();//get the Date for the shift
    sheetDestination.getRange(9,7).setValue(shiftDate + shiftEndTime);
}

下面是函数。我正在添加工作表的图片。基本上时间表显示一个班次(4小时班次),每行表示同一班次1小时。

我正在尝试将其设置为 1 行,开始和结束时间显示为 4 小时轮班。例如从上午 10 点到下午 2 点,并且有一个单元格需要日期 + 时间(输出太错误了!)

【问题讨论】:

  • 您认为在字符串连接中尝试使用setValue 方法的调用会返回什么?

标签: javascript google-apps-script google-sheets


【解决方案1】:

这是你的数据问题,而不是你的代码,虽然我不想评论代码,因为它是用谷歌写的,我不明白。

当您打开一个新工作表时,其所有单元格都预先格式化为“常规”,这意味着 Excel 会猜测您输入的数据类型并相应地应用合适的格式。如果您输入 Excel 识别为日期的内容,Excel 将应用日期格式。如果 Excel 将该条目识别为时间,也会发生同样的情况。但请注意,您可以通过多种方式覆盖此自动化,我们不知道您在工作表中做了什么。

当 Excel 确定您输入了日期(或将单元格设置为日期格式)时,Excel 会将您输入的内容转换为数字。今天日期的数字是 44057。明天将是 44058,依此类推,从 1900 年 1 月 1 日开始计算。

时间表示为一天的小数,意思是 1 的小数。0.5 是半天 = 中午 12 点。如果您输入 18:006:00 PM,Excel 会将单元格的值存储为 0.75。因此 [日期] + [时间] = [日期/时间]。 44057 + 0.75 = 44057.75。

如果您在单元格中输入这样的值 - 作为数字(您可以尝试同样的) - Excel 在单元格中显示的内容取决于单元格格式。如果您将单元格格式设置为 *dd mmm yyyy HH:mm:ss",Excel 将显示 2020 年 8 月 14 日 18:00:00 或者 2020 年 8 月 14 日 06:00:00 PM,取决于您的区域设置。我想 GoogleSheets 也会这样做。

如果您输入“44057.75”,Excel 将识别数字,而不是日期。您需要应用日期格式来更改显示。但是,如果您输入“2020 年 8 月 14 日 18:00”,Excel 将识别日期/时间值。要使单元格显示其值,请将单元格设置为“常规”或给它一个数字格式。

【讨论】:

  • 很抱歉打扰这个问题,OP 错误地将其标记为 [excel]。他们的问题是setValue 方法的返回值(这是Range 类的一个实例,因此是结果)...
  • @Oleg Valter OP 想要“连接”日期和时间。我正在向他展示基本逻辑。他会找到实现它的方法。
  • Variatus,我对你的回答没有意见。尽管 OP 确实存在导致问题的代码的严重问题,但“不是您的代码”不是我会使用的术语。
【解决方案2】:

为了排除故障,您应该在战略位置记录变量及其类型

示例:

function shiftDuration () {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetDestination = spreadsheet.getSheetByName("NewToImport");
  var timeStartforShift = sheetDestination.getRange(2, 4).getDisplayValue(); //start time
  // the following returns "string"
  Logger.log(typeof timeStartforShift);
  var timeEndforShift = sheetDestination.getRange(5, 5).getDisplayValue(); //end time
  var shiftDuration = Math.floor(parseInt(timeEndforShift) - parseInt(timeStartforShift)); 
  var rangeDurantionToCopy = sheetDestination.getRange(1, 1, 2, sheetDestination.getMaxColumns());
  //careful with this line! You ar overwriting getRange(9,3)!!!
  //   rangeDurantionToCopy.copyTo(sheetDestination.getRange(8,1));
  //the following returns "10:00"120:
  Logger.log(timeStartforShift + (shiftDuration * 60));
  var shiftEndTime = sheetDestination.getRange(9,5).setValue(timeStartforShift + (shiftDuration * 60));
  var shiftDate = sheetDestination.getRange(9,3).getValue();
  // the following returns `object`  - a date object
  Logger.log(typeof shiftDate); 
  // the following returns `object`  - a date object
  Logger.log(typeof shiftEndTime);
  sheetDestination.getRange(9,7).setValue(shiftDate + shiftEndTime);
}
  • 以上示例中的日志显示您正在尝试对不同类型的变量求和
  • 这将产生字符串,即已拼凑在一起的文本
  • 您不能对非数字变量执行数学运算 - 这也适用于日期对象

您有三个选择:

  • 以字符串的形式单独检索您的日期和时间(例如使用getDisplayValues())并“将它们拼凑在一起”
  • 使用 Javascript 日期函数(如 getTime())将日期对象转换为毫秒 - 即数字,将秒数相加并将总和转换回日期对象
  • 使用setHours()setMinutes()等方法修改日期对象

在您的情况下,后一种方法可能是最简单的,并且有利于将有效日期而不是文本返回到您的电子表格中。

示例:

function shiftDuration () {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetDestination = spreadsheet.getSheetByName("NewToImport");
  var timeStartforShift = sheetDestination.getRange(2, 4).getDisplayValue(); //start time
  var timeEndforShift = sheetDestination.getRange(5, 5).getDisplayValue(); //end time
  var shiftDuration = Math.floor(parseInt(timeEndforShift) - parseInt(timeStartforShift)); 
  var hours = timeEndforShift.split(":")[0];
  var minutes = timeEndforShift.split(":")[1];
  var shiftDate = sheetDestination.getRange(9,3).getValue();
  Logger.log("before adding the time: " + shiftDate); 
  shiftDate.setHours(hours);
  shiftDate.setMinutes(minutes);
  Logger.log("after adding the time: " + shiftDate); 
  sheetDestination.getRange(9,7).setValue(shiftDate).setNumberFormat("yyyy-MM-dd hh:mm");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2016-01-21
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多