首页 > 解决方案 > 使用 Google 脚本在 Google 表格上搜索/匹配日期,并将源范围复制到目标范围 OFFSET 从该日期开始

问题描述

我正在为 Google 表格中的一些简单的复制/粘贴脚本而苦苦挣扎。我是一个完整的脚本新手。Excel/Sheets 高级。

我有一个“今天”数据输入表。我有一个“程序”表,将数据存储在日期标题下的列中。我想要一个宏/脚本,它将: 1. 从今天的范围内剪切数据 2. 在“程序”中搜索日期行以匹配“今天”数据输入页面上的任何日期。
3. 最后将数据粘贴到从步骤 2 中确定的日期开始向下的 Program xx 行的范围内

本质上我想反向索引/匹配。我不想在 INDEX/MATCH 中返回一个单元格,而是想复制到一个单元格。

工作表在这里: https ://docs.google.com/spreadsheets/d/19r6IbgdYCPOZjNr92MA0vAKQ_R2Fx5JohuC0DE8ekPo/edit?usp=sharing

以下是我所得到的。我可以从特定单元格剪切/粘贴到另一个单元格。但需要以某种方式找出“var destination”。

function copydata2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var source = ss.getRange('Today!b11:g11');

  source.copyTo(ss.getRange('Program!d11:i11'), {contentsOnly: true});
  source.clear();
};

标签: dategoogle-apps-scriptgoogle-sheets

解决方案


尝试这个:

function test2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var today = ss.getSheetByName("Today");
  var program = ss.getSheetByName("Program");
  var date = today.getRange("B4").getValue();
  var targetDates = program.getRange("D4:KL4").getValues();
  var column;

  // Get the target column.
  for (var i = 0; i < targetDates[0].length; i++){
    if (targetDates[0][i].toString() == date.toString()){
      column = i + 4; // To account for the first cols.
      Logger.log("found the date " + targetDates[0][i] + " at column " + column + " with i = " + i);
      break;
    }
    else continue;
  }

  // Move the values.
  today.getRange("B11:G11").moveTo(program.getRange(11, column)); // Sq w/ Belt
  today.getRange("J11:O11").moveTo(program.getRange(16, column)); // 2ct Paused Squat
  today.getRange("R11:W11").moveTo(program.getRange(21, column)); // Pin Squat
  today.getRange("Z11:AE11").moveTo(program.getRange(26, column)); // 3-0-3 Tempo Squat
  today.getRange("AH11:AM11").moveTo(program.getRange(31, column)); // Sq no Belt

  today.getRange("B19:H19").moveTo(program.getRange(37, column)); // 1 Ct Paused Bench Press
  today.getRange("J19:O19").moveTo(program.getRange(42, column)); // Overhead Press w/ Belt
  today.getRange("R19:W19").moveTo(program.getRange(47, column)); // Close Grip Bench Press
  today.getRange("Z19:AE19").moveTo(program.getRange(52, column)); // 2 Ct Paused Bench Press
  today.getRange("AH19:AM19").moveTo(program.getRange(57, column)); // 3 Ct Paused Bench Press
  today.getRange("AP19:AU19").moveTo(program.getRange(62, column)); // Pin Bench Press

  today.getRange("B27:H27").moveTo(program.getRange(68, column)); // Deadlift w/ Belt
  today.getRange("J27:O27").moveTo(program.getRange(73, column)); // Rack Pull - mid shin
  today.getRange("R27:W27").moveTo(program.getRange(78, column)); // 2 ct Paused Deadlift
  today.getRange("AH27:AM27").moveTo(program.getRange(83, column)); // Pendlay Rows
}

我使用了几件事moveTo()此处的文档),它将值剪切/粘贴到目标,唯一的问题是它覆盖了样式格式。使用表格时,最好使用getValues()setValues()避免多次调用 API。但是,在这种情况下,由于您的数据是以一种特殊的方式组织的,因此为了复杂性,最好像这样工作。如果您有任何疑问,请告诉我。我在您提供的工作表的副本上对其进行了测试,它按预期工作。


推荐阅读