Как конвертировать файл Документов Google в Excel файл (XLSX)

На изображении отображается обновленный код.

var "xlsFile" undefined, почему? Как преобразовать файл Googledocs в файл Excel с помощью (GoogleDocs) ScriptEditor

function googleOAuth_ (name, scope) {
 var oAuthConfig = UrlFetchApp.addOAuthService(name);
 oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken? scope="+scope);
 oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
 oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
 oAuthConfig.setConsumerKey('anonymous');
 oAuthConfig.setConsumerSecret('anonymous');
 return {oAuthServiceName:name, oAuthUseToken:"always"};
 }
 function test(){
 var id = '#'
 exportToXls(id)
 }
 function exportToXls(id){
 var mute = {muteHttpExceptions: true };
 var name = DriveApp.getFileById(id).getName()
 var url = 'https://docs.google.com/feeds/';
 var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls', mute).getBlob()
 var xlsfile = DocsList.createFile(doc).rename(name+'.xlsx')
 }
2 ответа

Используя API-интерфейс Drive, мы можем получить больше информации о файлах, чем доступно с помощью методов DriveApp. Проверьте данные файла, особенно exportLinks. Эти ссылки содержат магию, которая позволит нам получить файл XLS. (Для удовольствия установите точку останова после того, как file назначен, и проверьте, какую информацию вы должны играть.)

Этот script использует Advanced Drive Service, который должен быть включен. Более полная версия с проверкой ошибок доступна в этом значении.

/**
 * Downloads spreadsheet with given file id as an Excel file.
 * Uses Advanced Drive Service, which must be enabled. * Throws if error encountered.
 *
 * @param {String} fileId File ID of Sheets file on Drive.
 */
function downloadXLS(fileId) {
 var file = Drive.Files.get(fileId);
 var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];
 var options = {
 headers: {
 Authorization:"Bearer "+ScriptApp.getOAuthToken()
 },
 muteHttpExceptions : true /// Get failure results
 }
 var response = UrlFetchApp.fetch(url, options);
 var status = response.getResponseCode();
 var result = response.getContentText();
 if (status != 200) {
 // Get additional error message info, depending on format
 if (result.toUpperCase().indexOf("


В приведенном ниже коде используется oAuthConfig, который теперь устарел. Вместо этого используйте Mogsdad. Функция importXLS использует API дисков и все еще работает.

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

Mogsdad ответ здесь (одновременно) приносит элегантное решение с использованием сервиса диска, вот еще один, поэтому у вас есть выбор: -)

В качестве бонуса я добавил обратный процесс, если он вам понадобится.

Используйте вызов функции, аналогичный тому, что я использую в тестовой функции, чтобы заставить его работать.

function googleOAuth_(name,scope) {
 var oAuthConfig = UrlFetchApp.addOAuthService(name);
 oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
 oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
 oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
 oAuthConfig.setConsumerKey('anonymous');
 oAuthConfig.setConsumerSecret('anonymous');
 return {oAuthServiceName:name, oAuthUseToken:"always"};
}
function test(){
 var id = 'spreadsheet_ID'
 exportToXls(id)
}
function exportToXls(id){
 var name = DriveApp.getFileById(id).getName()
 var url = 'https://docs.google.com/feeds/';
 var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls',
 googleOAuth_('docs',url)).getBlob()
 var xlsfile = DocsList.createFile(doc).rename(name+'.xls')
}
function importXLS(){
 var files = DriveApp.searchFiles('title contains ".xls"');
 while(files.hasNext()){
 var xFile = files.next();
 var name = xFile.getName();
 if (name.indexOf('.xls')>-1){
 var ID = xFile.getId();
 var xBlob = xFile.getBlob();
 var newFile = { title : name+'_converted',
 key : ID
 }
 file = Drive.Files.insert(newFile, xBlob, {
 convert: true
 });
 }
 }
}

licensed under cc by-sa 3.0 with attribution.