繁体   English   中英

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

[英]How to get google sheet's cell values as is using google script

我将要使用google sheet作为我的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脚本获取单元格的值时,似乎已重新格式化

日期看起来像这样: 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)

[更新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并忽略秒。 除非你们有其他解决方法,否则我将不胜感激。

再次感谢社区。

首先,我不知道这是否与您的问题有关,但是电子表格和脚本都有各自的时区设置:电子表格: File >> Spreadsheet Settings >> Time Zone Script: File >> Project Properties >> Time Zone 如果这些不同,可能导致混乱。 如果您的所有用户都在同一时区,那么一个答案就是将他们设置为相同的时区。 或者,这些可以从你的脚本中所描述的确定这里 ,并列入处理任何分歧逻辑。 我不明白几分钟的时差,也许您的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]]

在此处输入图片说明

但是在下面的代码中, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM