【问题标题】:Fixing script to input 2021-02-01 instead of 2021-02-32修复脚本以输入 2021-02-01 而不是 2021-02-32
【发布时间】:2021-05-10 04:22:46
【问题描述】:

我正在尝试在 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, 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, 1).setValues([[posts]]);
  sheet.getRange(nextRowJ, 10, 1, 1).setValues([[followers]]);
  sheet.getRange(nextRowK, 11, 1, 1).setValues([[following]]);
  sheet.getRange(nextRowL, 12, 1, 1).setValues([[engagement]]);
  sheet.getRange(nextRowM, 13, 1, 1).setValues([[likes]]);
  sheet.getRange(nextRowN, 14, 1, 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, 1, 1, 2).setValues([[date,'一致的一段文字']]);

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

【问题讨论】:

    标签: datetime google-apps-script simpledateformat


    【解决方案1】:

    用途:

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

    原因:

    Utilities.formatDate(date, timeZone, format) 关注此format guidelines

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

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

    【讨论】:

    • 只是想补充一点,这是正确的,但它很愚蠢而且违反直觉!一般人会认为是 DD,因为 YYYY 和 MM 是大写字母!
    • @J.G.您应该使用yyyy(小写),否则一年中的第一周/最后一周您可能会得到错误的年份
    • @Rubén 感谢您指出这一点,我将更新答案以指出年份格式以供参考
    【解决方案2】:

    如果您发现使用 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 位数分钟的统计数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2018-02-04
      • 2021-12-15
      • 2014-12-28
      • 2021-11-12
      相关资源
      最近更新 更多