修复脚本以输入 2021-02-01 而不是 2021-02-32

问题描述

我正在尝试在 Google 表格的脚本编辑器中使用此代码插入今天的日期以及一致的文本,并且在 2021 年 1 月 31 日之前一直运行良好,当时它开始插入 2021-02-32 、2021-02-33 等,而不是 2021-02-01、2021-02-02 等。这是我正在运行的代码

function daily() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName("Social Tracker");
  var date = Utilities.formatDate(new Date(),"GMT","YYYY-MM-DD");
  var aValues = sh.getRange("A1:A").getValues();
  var aLast = aValues.filter(String).length;

  // Assuming A and B have same last row,no need for B
  // If different,need to calculate separately
  var bValues = sh.getRange("B1:B").getValues();
  var bLast = bValues.filter(String).length;
  
  // If A and B are the same,use setValues
  sh.getRange(aLast + 1,1,2).setValues([[date,'handle']]);

  var sheet = SpreadsheetApp.getActiveSheet();

  var followers = sheet.getRange(2,5,sheet.getLastRow()).getValues();
  var nextRowJ = getFirstemptyRow('J');

  var following = sheet.getRange(2,6,sheet.getLastRow()).getValues();
  var nextRowK = getFirstemptyRow('K');

  var engagement = sheet.getRange(2,7,sheet.getLastRow()).getValues();
  var nextRowL = getFirstemptyRow('L');

  var likes = sheet.getRange(2,8,sheet.getLastRow()).getValues();
  var nextRowM = getFirstemptyRow('M');

  var comments = sheet.getRange(2,9,sheet.getLastRow()).getValues();
  var nextRowN = getFirstemptyRow('N');

  var posts = sheet.getRange(2,4,sheet.getLastRow()).getValues();
  var nextRowO = getFirstemptyRow('O');


  
  // Record current balance and timestamp at end of columns B & C
  sheet.getRange(nextRowO,15,1).setValues([[posts]]);
  sheet.getRange(nextRowJ,10,1).setValues([[followers]]);
  sheet.getRange(nextRowK,11,1).setValues([[following]]);
  sheet.getRange(nextRowL,12,1).setValues([[engagement]]);
  sheet.getRange(nextRowM,13,1).setValues([[likes]]);
  sheet.getRange(nextRowN,14,1).setValues([[comments]]);

}

// From https://stackoverflow.com/a/9102463/1677912
function getFirstemptyRow(columnLetter) {
  columnLetter = columnLetter || 'A';
  var rangeA1 = columnLetter + ':' + columnLetter;
  var spr = SpreadsheetApp.getActiveSpreadsheet();
  var column = spr.getRange(rangeA1);
  var values = column.getValues(); // get all data in one call
  var ct = 0;
  while ( values[ct][0] != "" ) {
    ct++;
  }

这是 cells that are being filled in by the script 的图像。我假设我的问题与这条线有关: sh.getRange(aLast + 1,2).setValues([[日期,'一致的文本']]);

我如何调整它以确保它遵循 A1 中的下一个日期,即。插入 2021-02-01 而不是 2021-02-32?

解决方法

使用:

var date = Utilities.formatDate(new Date(),"GMT","yyyy-MM-dd");

原因:

Utilities.formatDate(date,timeZone,format) 跟随此 format guidelines

当您使用 "DD" 时,您指定一年中的哪一天。如果要指定月份中的日期,则需要使用 dd

此外,当您使用 "YYYY" 时,您指的是一周年。如果您想获得实际年份,请改用 "yyyy"

,

如果您发现使用 Java SE Simple Date Format 违反直觉,并且您使用的是 Google Apps Script V8 运行时而不是使用 Utilities.formatdate(),那么您可能习惯于 Date.prototype.toLocaleDateString


使用 "YYYY-MM-DD" 代替 "yyyy-MM-dd"

  • YYYY 代表 4 位数的弱年份(一年的第一周/最后一周,它可能返回与您预期不同的数字。
  • yyyy 代表 4 位数年份
  • DD 代表日年(32 是 2 月 1 日)
  • MM 代表 2 位数月份(02 是二月)
  • mm 2 位数分钟的统计数据