Как я могу экспортировать вкладки Google Sheets в Excel из Apps Script с помощью Sheets Gid?

Я хочу создать функцию 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);
}

В целях тестирования я включил в сценарий имя листа «Гарольд Дженкинс» (только для отображения желаемых результатов). Требовать структуру листа

В некоторых столбцах целевых листов есть формулы, поэтому важно, чтобы при экспорте использовались только значения.

Фиктивная таблица

Прошу прощения, но не могли бы вы рассказать подробнее, как вы хотели достичь желаемого результата? Пробовали ли вы жестко закодировать идентификатор листа вместо имени листа?

George 14.06.2024 00:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что ваша цель состоит в следующем.

  • Из 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.

Другие вопросы по теме