Я хочу создать функцию Google Apps Script, которая копирует/экспортирует определенные вкладки Google Sheet в электронную таблицу Excel. Мне нужно, чтобы эти листы назначались с помощью Sheet Gid; поскольку имя листа можно обновить/пересмотреть. Экспортированный файл Excel копируется в указанную папку. Вкладки «Ссылка и индексный лист» необходимо исключить из экспорта.
Мой текущий сценарий экспортируется в Excel, но формулы также копируются, что приводит к ошибке и не отображает суммы/значения.
function exportToExcel() {
var exportSheetName1 = 'Index'; // Exclude sheet from export to excel
var exportSheetName2 = 'Reference'; // Exclude sheet from export to excel
var exportTest = "Harold Jenkins";
const ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet = ss.getActiveSheet();
var name = sheet.getRange('Reference!M2').getDisplayValue();
var destination = DriveApp.getFolderById("1HRchNqQ5_0LYzfULw1hWN_ALNuijsy2q"); // Google Drive Folder Location
// 1. Copy the active Spreadsheet as a tempora Spreadsheet.
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet().copy('tmp');
// 2. Convert the formulas to the texts.
const targetRange = spreadsheet.getSheetByName(exportTest).getDataRange();
targetRange.copyTo(targetRange, {contentsOnly:true});
// 3. Delete/Exclude sheets: Index and Reference
spreadsheet.getSheets().forEach(sheet => {
if (exportSheetName1 == sheet.getName() || exportSheetName2 == sheet.getName()) spreadsheet.deleteSheet(sheet)
});
// 4. Retrieve the blob from the export URL.
const id = spreadsheet.getId();
const xlsxBlob = UrlFetchApp.fetch(`https://docs.google.com/spreadsheets/export?id=${id}&exportFormat=xlsx`, {headers: {authorization: `Bearer ${ScriptApp.getOAuthToken()}`}}).getBlob();
// 5. Create the blob as a file.
destination.createFile(xlsxBlob.setName(`${name}.xlsx`));
// 6. Delete the temporate Spreadsheet.
DriveApp.getFileById(id).setTrashed(true);
}
В целях тестирования я включил в сценарий имя листа «Гарольд Дженкинс» (только для отображения желаемых результатов). Требовать структуру листа
В некоторых столбцах целевых листов есть формулы, поэтому важно, чтобы при экспорте использовались только значения.
Я считаю, что ваша цель состоит в следующем.
I need these sheets to be assigned by the Sheet Gid; as the Sheet Name can be updated/revised.
вы хотите экспортировать лист по идентификатору листа в виде файла XLSX с помощью скрипта Google Apps.В этом случае как насчет следующей модификации?
Прежде чем проверить это, установите идентификаторы листов, которые вы хотите экспортировать, в exportSheetIds
. Если вы хотите экспортировать несколько листов, установите их как var exportSheetIds = ["sheetId1", "sheetId2",,,];
.
function exportToExcel() {
var exportSheetIds = ["#####"]; // Please set the sheet IDs you want to export.
const ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var name = sheet.getRange('Reference!M2').getDisplayValue();
var destination = DriveApp.getFolderById("1HRchNqQ5_0LYzfULw1hWN_ALNuijsy2q"); // Google Drive Folder Location
// 1. Copy the active Spreadsheet as a tempora Spreadsheet.
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet().copy('tmp');
const sheets = spreadsheet.getSheets();
const check = sheets.filter(s => exportSheetIds.includes(s.getSheetId().toString()));
if (check.length == 0) {
throw new Error("No export sheets.");
}
// 2. Convert the formulas to the texts.
sheets.forEach(sheet => {
if (exportSheetIds.includes(sheet.getSheetId().toString())) {
const targetRange = sheet.getDataRange();
targetRange.copyTo(targetRange, { contentsOnly: true });
}
});
// 3. Delete/Exclude sheets: Index and Reference
sheets.forEach(sheet => {
if (!exportSheetIds.includes(sheet.getSheetId().toString())) {
spreadsheet.deleteSheet(sheet);
}
});
SpreadsheetApp.flush();
// 4. Retrieve the blob from the export URL.
const id = spreadsheet.getId();
const xlsxBlob = UrlFetchApp.fetch(`https://docs.google.com/spreadsheets/export?id=${id}&exportFormat=xlsx`, { headers: { authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }).getBlob();
// 5. Create the blob as a file.
destination.createFile(xlsxBlob.setName(`${name}.xlsx`));
// 6. Delete the temporate Spreadsheet.
DriveApp.getFileById(id).setTrashed(true);
}
exportSheetIds
создается файл XLSX, включающий листы 1HRchNqQ5_0LYzfULw1hWN_ALNuijsy2q
.
Прошу прощения, но не могли бы вы рассказать подробнее, как вы хотели достичь желаемого результата? Пробовали ли вы жестко закодировать идентификатор листа вместо имени листа?