#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);
}