如何使用Google脚本按原样获取Google表格的单元格值

时间:2019-01-31 08:37:08

标签: google-apps-script google-sheets

我将使用Google表格作为我的Android应用程序小项目的数据库。我正在使用Google脚本来处理来自我的应用程序的请求。

我在Google表格中存储;

  • A2:A =日期为dd / mm / yyyy例如21/12/2019但 显示格式为dd-MMM,例如21-Dec

  • C2:D =时间为hh:mm:ss例如21:00:00但 显示格式为hh:mm例如21:00

是的,我需要一种不同的显示和输入格式。

我的Google工作表:

enter image description here

当我使用Google脚本获取单元格的值时,它似乎已重新格式化

日期看起来像这样:Sat Jan 01 2019 00:00:00 GMT+0700 (ICT) 另一方面,时间值会有所变化。 20:00:00至19:52:48

是否有任何功能可以将单元格的实际值获取为文本而无需重新格式化?

我唯一想到的就是可以使用getDisplayValues()而不是使用getValues()。值将不会重新格式化,但这对我来说不是解决方案,因为它将采用显示格式。

我的代码段:

function updateData(e, sheet) {
  var tgl = e.parameter.tgl;
  var dtg = e.parameter.dtg;
  var plg = e.parameter.plg;
  var lbr = e.parameter.lbr;

  var rangeHead = sheet.getRange("A2:A");
  var valuesHead = rangeHead.getValues();

  var rangeFirst = sheet.getRange("C2:D")
  var valuesFirst = rangeFirst.getValues();

  var rangeSecond = sheet.getRange("G2:G")
  var valuesSecond = rangeSecond.getValues();

  for (var i = 0; i < valuesHead.length; i++) {
    if (valuesHead[i][0] === tgl) {
      if(dtg!="null") { valuesFirst[i][0] = dtg; }
      if(plg!="null") { valuesFirst[i][1] = plg; }
      if(lbr!="null") { valuesSecond[i][0] = lbr; }
      break;
    }
  }
  rangeFirst.setValues(valuesFirst);
  rangeSecond.setValues(valuesSecond);
}

该代码将无法正常工作,因为我将21/12/2019Sat Jan 01 2019 00:00:00 GMT+0700 (GMT)进行比较。

[UPDATE 1]: 谢谢P-Burke的启发。现在,我有一个解决日期问题的想法。我知道脚本将日期作为日期对象,但是我不知道它也保存为日期对象。 (嘿,我不好)我没有意识到,因为我在调用values [0] [0]时没有自动完成功能。当然,因为它可以在运行时识别对象类型。

因此,我的解决方法是;我将调用getDate,getMonth + 1和getYear。之后,我将自由地与参数进行比较。

尽管,时间单元仍然让我有些困惑。时间偏移为18分12秒。我不认为这是因为时区不同和我的计算机时钟不同。时区差异太大,因此我确保脚本,电子表格和本地时区都相同。我的计算机时钟也只落后一分钟。

[更新2]: 好吧,足够的困惑了。似乎该脚本将时间转换为与我本地时区相关的Date对象。我从另一个线程得到了这个答案。因此,实际上,我的本地时区变化了很多次,其中一些时区的偏移量小于小时单位(我所在地区使用的时区之一是UTC +7:07:12h)。记录这些更改的唯一来源是来自https://www.timeanddate.com/time/zone/indonesia/jakarta。最后,我放弃了。为了我的天赋,我将只使用getDisplayValue并忽略秒。除非你们有其他解决方法,否则我将不胜感激。

再次感谢您的社区。

1 个答案:

答案 0 :(得分:0)

首先,我不知道这是否与您的问题有关,但是电子表格和脚本各自具有自己的时区设置: 试算表:File >> Spreadsheet Settings >> Time ZoneScript: File >> Project Properties >> Time Zone。 如果这些不同,可能导致混乱。如果您的所有用户都在同一时区,那么一个答案就是将他们设置为相同的时区。另外,您可以按照here所述从脚本中确定这些内容,并包含用于处理任何差异的逻辑。我不明白几分钟的时差,也许您的PC时钟不准确?

我认为与您的问题更相关的另一点是,您实际上在玩多种日期/时间格式。下图显示了在电子表格中,时间是以一种格式(02/01/2019 09:00:00)进行编辑的,但是使用格式菜单为单元格定义的任何格式显示。但是,当使用getValues()将单元格值提取到脚本中并显示时,它们显示如下:Values: [[Thu Jan 31 09:00:00 GMT+00:00 2019, Wed Jan 02 09:00:00 GMT+00:00 2019]]

enter image description here

在下面的代码中,values[0][0]values[0][1]实际上是JavaScript Date()对象,可以按常规方式进行比较,或者可以将它们重新格式化为所需的任何字符串格式如下代码所示:

function myFunction() {
    var ss = SpreadsheetApp.getActive();
    var ws = ss.getActiveSheet();
    var input_range = ws.getRange("A1:B1");
    var values = [];
    values = input_range.getValues(); // Returns a multi-dimensional array, hence [0][0] to access.
    Logger.log("Values: %s", values);

    // As Date() objects the usual methods are available.
    Logger.log("Date().getMonth(): %s",values[0][0].getMonth());
    Logger.log("Date().getYear(): %s",values[0][1].getYear());

    // This formats the date as Greenwich Mean Time in the format
    // year-month-dateThour-minute-second.
    var formattedDate = Utilities.formatDate(values[0][0], "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
    Logger.log(formattedDate);
    formattedDate = Utilities.formatDate(values[0][1], "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
    Logger.log(formattedDate);
}

Logger.log output:    
[19-01-31 11:43:17:635 GMT] Values: [[Thu Jan 31 09:00:00 GMT+00:00 2019, Wed Jan 02 09:00:00 GMT+00:00 2019]]
[19-01-31 11:43:17:636 GMT] Date().getMonth(): 0.0
[19-01-31 11:43:17:637 GMT] Date().getYear(): 2019.0
[19-01-31 11:43:17:638 GMT] 2019-01-31T09:00:00Z
[19-01-31 11:43:17:638 GMT] 2019-01-02T09:00:00Z