поиск / сопоставление даты в Google Sheets с использованием скрипта Google и копирование исходного диапазона в целевой диапазон OFFSET с этой даты - PullRequest
2 голосов
/ 20 сентября 2019

Я борюсь с некоторыми простыми сценариями копирования / вставки в Google Sheets.Я полный сценарий новичка.Продвинутый в Excel / Sheets.

У меня есть лист ввода данных «Сегодня».У меня есть «Программа» лист, который хранит данные в столбце под заголовком Дата.Я хочу макрос / скрипт, который будет: 1. вырезать данные из диапазона за сегодня 2. найти строку даты в «Программе», чтобы найти совпадение с любой датой на странице ввода данных «сегодня».
3. Наконец вставить данныедо диапазона в строках программы xx вниз от указанной даты в шаге 2

По сути, я хочу выполнить INDEX / MATCH в обратном порядке.Вместо того, чтобы возвращать ячейку в 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();
};

1 Ответ

0 голосов
/ 23 сентября 2019

Попробуйте это:

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() ( документация здесь ), которая вырезает / вставляет значения в цель, единственная проблема заключается в том, чтоэто переписывает формат стиля.При работе с Sheets всегда лучше использовать getValues() и setValues(), чтобы избежать нескольких вызовов API.В этом случае, однако, так как ваши данные были организованы таким особым образом, было бы лучше работать так из соображений сложности.Пожалуйста, дайте мне знать, если у вас есть какие-либо сомнения.Я проверил его на копии предоставленного вами листа, и он работал как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...