копирование из электронной таблицы в другую электронную таблицу с динамическим заголовком

#google-apps-script #google-sheets #google-sheets-api #sourceforge-appscript

#google-приложения-скрипт #google-таблицы #google-sheets-api #sourceforge-appscript

Вопрос:

В настоящее время я работаю над проектом, в котором мне нужно скопировать данные с одного конкретного листа электронной таблицы в другую электронную таблицу с динамическим заголовком (текст с датой). перемещение данных по идентификатору или по имени — это нормально, но со свежесозданной электронной таблицей это кажется ерундой. все функции будут находиться в одном и том же скрипте приложения: создание копии

 function titleAsDate() {

  var currentDate = Utilities.formatDate(new Date(), "GMT 8", "dd-MM-yyyy HH:mm:ss")
  SpreadsheetApp.create("Report of the "   currentDate)
}

function copyWithValues() {
  let spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  let sourceSheet = spreadSheet.getSheetByName('Sources');
  
  let sourceRange = sourceSheet.getDataRange();
  let sourceValues = sourceRange.getValues();
  
  let rowCount = sourceValues.length;
  let columnCount = sourceValues[0].length;
  
  let targetSheet = spreadSheet.getSheetById('Target');
  let targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  
  targetRange.setValues(sourceValues);
}
 

Ответ №1:

Объяснение:

  • SpreadsheetApp.create(name) возвращает объект электронной таблицы, поэтому вы можете напрямую использовать вывод этой функции напрямую, без необходимости дополнительного кода.
  • Во вновь созданной электронной таблице будет один лист с именем Sheet1 , как при создании нового файла электронной таблицы вручную. Поэтому вы можете использовать функцию sheet.setName(name), чтобы изменить имя листа на Target . Также эта функция возвращает объект sheet ( targetSheet ), который затем можно использовать для установки значений.

Решение:

Это весь код в одной функции:

 function copyWithValues() {
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = spreadSheet.getSheetByName('Sources');
  const sourceRange = sourceSheet.getDataRange();
  const sourceValues = sourceRange.getValues();
  
  const currentDate = Utilities.formatDate(new Date(), "GMT 8", "dd-MM-yyyy HH:mm:ss"); // new code
  const targetSpreadsheet = SpreadsheetApp.create("Report of the "   currentDate); // new code
  
  let rowCount = sourceValues.length;
  let columnCount = sourceValues[0].length;
  
  let targetSheet = targetSpreadsheet.getSheetByName('Sheet1').setName("Target"); // new code
  let targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  
  targetRange.setValues(sourceValues);
}
 

Если вы хотите использовать titleAsDate в качестве вспомогательной функции, которая будет вызываться copyWithValues , вы можете использовать этот код и выполнять только copyWithValues :

 // helper function, used by copyWithValues
function titleAsDate() {
  const currentDate = Utilities.formatDate(new Date(), "GMT 8", "dd-MM-yyyy HH:mm:ss");
  return SpreadsheetApp.create("Report of the "   currentDate); // new code
}

// main function, you should execute this function
function copyWithValues() {
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = spreadSheet.getSheetByName('Sources');
  const sourceRange = sourceSheet.getDataRange();
  const sourceValues = sourceRange.getValues();
  
  const targetSpreadsheet = titleAsDate(); // new code
  
  let rowCount = sourceValues.length;
  let columnCount = sourceValues[0].length;
  
  let targetSheet = targetSpreadsheet.getSheetByName('Sheet1').setName("Target"); // new code
  let targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  
  targetRange.setValues(sourceValues);
}