在 google 应用脚本中的特定行之间添加行

Add row between specific rows in google app script

我将数据从一个数据sheet复制到另一个数据。目前,我将目标 sheet 中的每一行都插入到最后插入的行

上方
datasheet.insertRowAfter(1);

每一行都有一个时间戳,格式如下:

25.05.2021 23:30:00

复制数据时会自动设置时间戳,并四舍五入到最后的 .30 时间。 如果我有时忘记复制数据,就会产生间隙。因此我想手动复制丢失的数据。 我在 Sourcesheet 中创建了一个布尔值和一个时间 https://i.imgur.com/l1031QI.png

现在我想将我的数据复制到现有时间戳之间的目标sheet。例如,上面屏幕截图中我的 8.30 时间戳必须在此行中设置: https://i.imgur.com/HY9cYMQ.png

我想“循环”时间戳列并找到手动时间的正确行并在那里创建一个新行并复制我的数据。 创建行和复制数据不是我的问题,只是找到两个日期之间的正确行。 将日期和时间都考虑在内对我来说很重要。

我不知道如何解决这个问题,也没有在网上找到任何东西。有人可以帮忙吗?

编辑: 当前代码从 sheet 复制到 sheet

function Parsetracking() {
  var spa=SpreadsheetApp.getActiveSpreadsheet();
  var inputsheet = spa.getSheetByName("Parse Output");
  var datasheet= spa.getSheetByName("Tracker");
  var parsesheet = spa.getSheetByName("Parse Input");

  var nowdate = new Date();
  var nowdateeurope = convertTZ(nowdate, "Europe/Berlin");
  var lastdate = datasheet.getRange("L2").getDisplayValues();
  var lasttime = datasheet.getRange("N2").getDisplayValues();
  
  var checkdate = joinDateAndTime(lastdate,lasttime)
  var diff = nowdateeurope - checkdate;
  if (parsesheet.getRange("j2").isChecked() === true) {
    //SpreadsheetApp.getUi().alert('Under Construction.');

    if (parsesheet.getRange("i2").getValue() < datasheet.getRange("k2").getValue()) {
      Logger.log('smaller')
    }
    else {
      Logger.log('bigger');
    }
    return;
  } 
  else {
    if(diff >= 3600001){
      datasheet.insertRowAfter(1);
      datasheet.clear;
      var datecell = datasheet.getRange("L2");
      var timecell = datasheet.getRange("M2");
      var roundedtimecell = datasheet.getRange("n2");
      inputsheet.getRange("A2:J2").copyTo(datasheet.getRange("A2:J2"),{contentsOnly:true});
      inputsheet.getRange("A3:J3").copyTo(datasheet.getRange("o2:W2"),{contentsOnly:true});
      datecell.setValue(nowdate).setNumberFormat("dd:mm:yyyy");;
      timecell.setValue(nowdate).setNumberFormat("hh:mm:ss");

      var gmt = new Date();
      gmt.setHours(nowdate.getUTCHours()+2);
      var hours = gmt.getHours();
      var minutes = nowdate.getUTCMinutes();
      var newtime = hours + ':' + minutes;
      console.log(newtime);
      var roundedtime = RoundTimestamp(newtime);
      console.log(roundedtime);
      roundedtimecell.setValue(roundedtime);
      datasheet.getRange('K3').autoFill(datasheet.getRange('K2:K3'),SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES)

    }
  }
}

如果您的时间戳已排序并具有相同的格式,则可以通过以下方式完成:

const timestamps = [
    "25.05.2021 23:20:00",
    "25.05.2021 23:30:00",
    "25.05.2021 23:40:00",
    "25.05.2021 23:50:00"
];

const missed_timestamp = "25.05.2021 23:35:00";

function DMY_to_YMD(dd_mm_yyyy) {
    return dd_mm_yyyy.replace(/(\d+).(\d+).(\d+)/, "");
}

const missed_YMD = DMY_to_YMD(missed_timestamp);

var index = 0

for (var time of timestamps) {
    if (missed_YMD < DMY_to_YMD(time)) break;
    index++;
}

timestamps.splice(index, 0, missed_timestamp);

console.log(timestamps);

输出:

[
  "25.05.2021 23:20:00",
  "25.05.2021 23:30:00",
  "25.05.2021 23:35:00", <-- here is the missed timestamp
  "25.05.2021 23:40:00",
  "25.05.2021 23:50:00"
]

如果您有一个非常庞大的时间戳列表,尝试实施二分搜索是有意义的。

简单地将二维数组转换为一维数组,反之亦然:

console.log([ [1], [2], [3] ].map(x => x[0])) // [ 1, 2, 3 ]

console.log([ 1, 2, 3 ].map(x => [x])) // [ [1], [2], [3] ]

更新

对于小数组,可以做得更简单:

const timestamps = [
    "25.05.2021 23:20:00",
    "25.05.2021 23:30:00",
    "25.05.2021 23:40:00",
    "25.05.2021 23:50:00"
];

const missed_timestamp = "25.05.2021 23:35:00";

const DMY_to_YMD = (dd_mm_yyyy) => 
    dd_mm_yyyy.replace(/(\d+).(\d+).(\d+)/, "");

const t     = DMY_to_YMD(missed_timestamp);
const arr   = timestamps.map(x => DMY_to_YMD(x));
const index = arr.concat([t]).sort().indexOf(t);

timestamps.splice(index, 0, missed_timestamp);

console.log(timestamps); // the same output as above