【问题标题】:Cannot get date from google sheet filled by google forms无法从谷歌表格填写的谷歌表格中获取日期
【发布时间】:2014-07-27 17:06:36
【问题描述】:

目的:从工作表中提取日期和时间(由填写的谷歌表格创建)并在电子邮件正文中使用它们,以便使用脚本自动设置。 脚本编辑器代码:

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 16;  // First row of data to process
  var numRows = 1;   // Number of rows to process

  for( var j=startRow; j<startRow + numRows; j++)
  {
    var color = sheet.getRange(j, 10).getBackground();
    if("#00ff00"==color)
    {
      // Fetch the range of cells A2:B3
      var row = sheet.getSheetValues(j, 1, 1, 14); //extract j th row till 14/Nth col
      var nameStudent = row[0][0] +" "+row[0][1];
      var time = row[0][6]+" on ";// +row[0][7]+" at "+row[0][8];
      var nameRecipient="Dear "+row[0][9]+",";
      var emailRecipient=row[0][13];
      var subject= "Date and time  "+row[0][5]+" at "+row[0][6];

      var message=nameRecipient+sheet.getRange("L11").getValue()+nameStudent+sheet.getRange("M11").getValue()+time+nameStudent+sheet.getRange("N11").getValue();

      MailApp.sendEmail(emailRecipient, subject, message);
      sheet.getRange(j,10).setBackground("#ff9900");
    }
  }
}

在输出中(即电子邮件):

日期由填写谷歌表格的人输入。 我正在访问使用表单创建的 google 表格。工作表截图: https://drive.google.com/file/d/0B2hiq6P5ceD-aUZQTDBVUXJYbEk/edit?usp=sharing 单元格(双击时)打开上面链接的屏幕截图中显示的日历。 我使用以下代码(使用 Google Apps 脚本)从工作表中获取一行:

var row = sheet.getSheetValues(j, 1, 1, 14); //extract j th row till 14/Nth col

在调试器中,日期如下所示:

[["Gaaav", "Budapest","de@erta.com", 9823527827, "San Francisco International Airport(SFO)", 41855, 0.5277777777810115,"Si016", "Al02", "Yaar", "pr", "3112", 94984802569, "jklfasj@kljsafkl.com"]]

在上述语句中,数字 41855 是日期。实际上是 8/4/2014 。但我看不懂。我也看不到时间,在上面的调试操作中,时间是 0.5277777777810115。

我附上调试屏幕的截图:

https://drive.google.com/file/d/0B2hiq6P5ceD-aFlDd2g4SlM5MW8/edit?usp=sharing

【问题讨论】:

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


    【解决方案1】:

    您在电子表格中看到的值是未格式化的日期,您可以通过选择适当的格式在电子表格 UI 本身中轻松更改:日期为 41855 的列,它将变为 4-Aug-2014 和列中的时间0.5277777777810115 将显示 12:40:00

    这些数字是电子表格中日期的本机值。天数从 1899 年 12 月 30 日开始计算,如果您将此参考添加 41855 天,您将获得 2014 年 8 月 4 日!就这么简单;-)

    时间是小时-分钟-秒的十进制表示(一天 24 小时的百分比,这里是十进制的 12.666666667 小时,实际上对应于 12:40:00 :-),因此可以将其添加到整数部分并给出完整的日期信息。

    一旦您在 SS 中正确设置了格式,脚本会将其读取为日期对象。我建议您将两者组合在一个单元格中以使脚本更简单:使用 =C2+D2 创建一个新列例如,如果 C 和 D 是列。

    见下图:


    编辑

    根据您的评论,我使用以下代码对您的 SS 副本进行了测试:

    function getDatesAndTime() {
      var sh = SpreadsheetApp.getActive().getSheets()[1];
      var dates = sh.getRange('F2:F').getValues();
      var hours = sh.getRange('G2:G').getValues();
      var complete = sh.getRange('H2:H').getValues();
      Logger.log(dates[0][0]);
      Logger.log(hours[0][0]);
      Logger.log(complete[0][0]);
    }
    

    我将SS的显示格式设置为F列的date,G列的Time和H列的date+time,其中我使用了公式=F2+G2

    这可以通过脚本完成,也可以像这样(在getValues() 之前插入):

      sh.getRange('F2:F').setNumberFormat('MM dd yyyy');
      sh.getRange('G2:G').setNumberFormat('HH:mm');
      sh.getRange('H2:H').setNumberFormat('MM dd yyyy HH:mm');
    

    修改后的工作表是here(仅供查看,复制编辑),下面是记录器结果

    注意:

    请务必检查电子表格和脚本中的时区设置是否相同(您的测试表和我的测试表中的太平洋时间!) 您在记录器中看到的小时差异来自夏令时问题......它已完全解释in this other post

    【讨论】:

    • 我正在访问使用表单创建的谷歌表格。工作表的屏幕截图:drive.google.com/file/d/0B2hiq6P5ceD-aUZQTDBVUXJYbEk/… 单元格(双击时)打开一个日历,如上面链接的屏幕截图所示。
    • 这意味着它实际上是一个日期值!而且我还看到日期格式正确。那是什么问题呢?
    • 参考调试屏幕截图的链接,日期和时间是数字格式而不是字符串。当我使用 sheet.getSheetValues(j, 1, 1, 14); 从工作表中获取日期和时间时我得到的是数字格式而不是字符串格式。这也可以在这里看到
      [["Gaaav", "Budapest","de@erta.com", 9823527827, "旧金山国际机场(SFO)", 41855, 0.5277777777810115,"Si016", "Al02 ", "Yaar", "pr", "3112", 94984802569, "jklfasj@kljsafkl.com"]] 我的最终目标只是在电子邮件正文中插入这个日期和时间。
    • 我正在共享工作表。查看您是否以字符串的形式提取日期和时间值。请参阅以下链接中的 SECOND 表:docs.google.com/spreadsheets/d/…
    • 在电子表格中,将 H 列的格式设置为日期,将 G 列的格式设置为时间(而不是菜单“123”中的“自动”),它按照我的回答中的说明工作。
    【解决方案2】:

    假设您提交的时间是电子表格中的第 14 行。

    将日期和时间值都转换为 Javascript 日期对象,然后使用表单中时间对象中的小时和分钟更新表单中的日期对象。

     function sendEmails() {
       var sheet = SpreadsheetApp.getActiveSheet();
       var startRow = 16;  // First row of data to process
       var numRows = 1;   // Number of rows to process
    
       for( var j=startRow; j<startRow + numRows; j++)
       {
         var color = sheet.getRange(j, 10).getBackground();
         if("#00ff00"==color)
         {
           // Fetch the range of cells A2:B3
           var row = sheet.getSheetValues(j, 1, 1, 14); //extract j th row till 14/Nth col
           var nameStudent = row[0][0] +" "+row[0][1];
           var time = row[0][6]+" on ";// +row[0][7]+" at "+row[0][8];
           var nameRecipient="Dear "+row[0][9]+",";
           var emailRecipient=row[0][13];
    
           // build out the date time object
            var dateInput = new Date(row[0][5]);
           var timeInput = new Date(row[0][6]);
           dateInput.setHours(timeInput.getHours())
           dateInput.setMinutes(timeInput.getMinutes());
           // format the date/time object into a string
           var dateString = Utilities.formatDate(dateInput, Session.getScriptTimeZone(), "MM/dd/yyyy hh:mm a");
    
      var subject= "Date and time  "+ dateString
    
      var message=nameRecipient+sheet.getRange("L11").getValue()+nameStudent+sheet.getRange("M11").getValue()+time+nameStudent+sheet.getRange("N11").getValue();
    
      MailApp.sendEmail(emailRecipient, subject, message);
      sheet.getRange(j,10).setBackground("#ff9900");
    }
    

    } }

    【讨论】:

    • 我的目的是从工作表中提取日期和时间(由填写的谷歌表单创建)并在电子邮件正文中使用它们,以便使用脚本自动设置。
    • 所以我更改了代码以在您的代码示例中创建一个字符串,即“08/04/2014 12:04 PM”。您可以使用 Utilities.formatDate 方法中的最后一个参数更改该格式。
    • 您还可以改进对消息正文的调用,而不是 3 个额外的服务器调用(例如 sheet.getRange("L11") 等...),将它们组合成一个... var messageValues = sheet.getRange("L11:N11");然后只需使用 messageValues[0][0] 等...;
    • 我试过你的代码,它没有用。现在显示的是 1969 年的日期
    • 验证数组索引是否正确。如果这是您的表单提交表,我会很惊讶 row[0][0] 会成为学生姓名的一部分,通常是表单提交的时间戳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多