Экспорт таблицы Google на Google Диск в формате Excel с помощью скрипта приложений

Я хотел бы создать резервную копию моей электронной таблицы Google в папке Google Диска, но в виде файла Excel. Мне удалось создать код, который создает копию gsheet и сохраняет ее в папке, но я не мог изменить код, чтобы сохранить его как файл Excel.

Не могли бы вы помочь мне с этим?

function makeCopy() {
  var formattedDate = Utilities.formatDate(new Date(), "CET", "yyyy-MM-dd' 'HH:mm");
  var name = "Backup Copy " + formattedDate;
  var destination = DriveApp.getFolderById("1vFL98cgKdMHLNLSc542pUt4FMRTthUvL");
  var file = DriveApp.getFileById("2SqIXLiic6-gjI2KwQ6OIgb-erbl3xqzohRgE06bfj2c")
  file.makeCopy(name, destination);
}

person Erika    schedule 22.04.2018    source источник
comment
Это должен быть макрос, который вы запускаете в текущей электронной таблице? Если это правда, есть несколько, возможно, более эффективных способов реализовать эту функцию.   -  person tehhowch    schedule 23.04.2018


Ответы (3)


Как насчет этого ответа? Я думаю, что для вашей ситуации есть несколько ответов. Так что считайте это одним из них.

Чтобы преобразовать электронную таблицу в Excel, можно использовать конечную точку https://docs.google.com/spreadsheets/d/" + sheetId + "/export?format=xlsx. В этом ответе это было использовано.

Измененный скрипт:

function makeCopy() {
  var formattedDate = Utilities.formatDate(new Date(), "CET", "yyyy-MM-dd' 'HH:mm");
  var name = "Backup Copy " + formattedDate;
  var destination = DriveApp.getFolderById("1vFL98cgKdMHLNLSc542pUt4FMRTthUvL");

  // Added
  var sheetId = "2SqIXLiic6-gjI2KwQ6OIgb-erbl3xqzohRgE06bfj2c";
  var url = "https://docs.google.com/spreadsheets/d/" + sheetId + "/export?format=xlsx&access_token=" + ScriptApp.getOAuthToken();
  var blob = UrlFetchApp.fetch(url).getBlob().setName(name + ".xlsx"); // Modified
  destination.createFile(blob);
}

Если я неправильно понял ваш вопрос, извините.

Информация обновлена: 7 февраля 2020 г.

С января 2020 года токен доступа нельзя использовать с параметром запроса, например access_token=###. Ссылка Поэтому, пожалуйста, используйте токен доступа к заголовку запроса вместо параметра запроса. Это так.

var res = UrlFetchApp.fetch(url, {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}});
person Tanaike    schedule 22.04.2018
comment
Я не уверен, что нам говорит ваше обновленное сообщение. Мы по-прежнему сохраняем &access_token=" + ScriptApp.getOAuthToken(); в конце? Не могли бы вы обновить свой ответ полным обновленным кодом? - person DanCue; 15.04.2020
comment
@DanCue Спасибо за ответ. Прошу прощения за плохое знание английского языка. В обновлении говорится, что с января 2020 года токен доступа нельзя использовать с параметром запроса, например access_token=###. Поэтому, пожалуйста, включите токен доступа в заголовок запроса вместо параметра запроса. Вы можете увидеть образец сценария для этого в обновленном вопросе. Если я неправильно понял ваш вопрос, прошу прощения. - person Tanaike; 15.04.2020

Просто хотел пометить команду из ответа Танаике и показать, как добавить аутентификацию в заголовок во время звонка.

function convertSheetToXLSX() {
  var sheetId = "2SqIXLiic6-gjI2KwQ6OIgb-erbl3xqzohRgE06bfj2c";
  var spreadsheetName = "My Spreadsheet";
  var destination = DriveApp.getFolderById("1vFL98cgKdMHLNLSc542pUt4FMRTthUvL");
  var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + sheetId + "&exportFormat=xlsx";  
  var params = {
    method      : "get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions: true
  };
  var blob = UrlFetchApp.fetch(url, params).getBlob();
  blob.setName(spreadsheetName + ".xlsx");
  destination.createFile(blob);
}

person MattMcCode    schedule 06.07.2020

Я просто добавил простой интерфейс, чтобы сделать его более полезным в повседневной жизни. Верхний скрипт является почти прямой копией кода MattMcCode. Так что дайте ему указание.

function exportSpreadsheetToXLSX(obj) {
  if (obj) {
    console.log(JSON.stringify(obj));
    var sheetId = obj.ssid;
    var spreadsheetName = obj.filename;
    var destination = DriveApp.getFolderById(obj.desid);
    var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + sheetId + "&exportFormat=xlsx";
    var params = {
      method: "get",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      muteHttpExceptions: true
    };
    var blob = UrlFetchApp.fetch(url, params).getBlob();
    blob.setName(spreadsheetName + ".xlsx");
    destination.createFile(blob);
  }
}

Просто выполните приведенный ниже диалог, чтобы ввести свой ssid, folderid и имя файла.

function openSpreadsheetExportToXLSXDialog() {
  let html = '';
  html += '<html><head><style> input{margin: 2px 5px 2px 0;}</style></head><body>';
  html += '<form>';
  html += '<input type="text" name="ssid" size="50" placeholder="Source Spreadsheet Id" /><br />';
  html += '<input type="text" name="desid" size="50" placeholder="Destination Folder Id" /><br />';
  html += '<input type="text" name="filename" size="50" placeholder="Spreadsheet ID" /><br />';
  html += '<input type="button" value="Submit" onClick="processForm(this.parentNode)" />';
  html += '<input type="button" value="Exit" onClick="google.script.host.close();" />';
  html += '</form>';
  html += '<script>';
  html += 'function processForm(obj){console.log(obj);google.script.run.withSuccessHandler((obj)=>{google.script.host.close();}).exportSpreadsheetToXLSX(obj);}';
  html += '</script></body></html>';
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html),'Spreadsheet Export to XLSX Dialog');
}
person Cooper    schedule 16.04.2021