Скрипт Google Apps для электронной почты.

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

После ответа на другое недавнее сообщение ( Thomas van Latum ) я попробовал предложенный документ api и получил интересный результат … вот тестовый код, который я использовал, и который работает хорошо, за исключением того, что файл находится в формате xlsx, а не в xls но в наши дни это не обязательно проблема:

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' var url = 'https://docs.google.com/feeds/'; var doc = UrlFetchApp.fetch(url+'download/spreadsheets/Export?key='+id+'&exportFormat=xls', googleOAuth_('docs',url)).getBlob() DocsList.createFile(doc).rename('newfile.xls') } 

примечание: если вы не переименовали его, его именем по умолчанию является Export.xlsx , может быть более полезно получить его идентификатор, чтобы использовать его позже … так что последняя строка может быть такой:

 var xlsfileID = DocsList.createFile(doc).getId() 

EDIT: чтобы запустить процесс авторизации, попробуйте такую ​​небольшую функцию, запустите ее из редактора сценариев

 function autorise(){ // function to call to authorize googleOauth var id=SpreadsheetApp.getActiveSpreadsheet().getId(); var url = 'https://docs.google.com/feeds/'; var doc = UrlFetchApp.fetch(url+'download/documents/Export?exportFormat=html&format=html&id='+id, googleOAuth_('docs',url)).getContentText(); } 

Тот, который работал на меня:

 var AUTH_TOKEN = "Enter your OAuth_Token"; ssID = SpreadsheetApp.getActiveSpreadsheet().getId(); var url = "http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key="+ ssID + "&exportFormat=xls"; //Add &gid=x at the end of above url if you only want a particular sheet var auth = "AuthSub token=\"" + AUTH_TOKEN + "\""; var res = UrlFetchApp.fetch(url, {headers: {Authorization: auth}}); var attachments = [{fileName:".xls", content: res.getContent(),mimeType:"application/vnd.ms-excel"}]; MailApp.sendEmail("", "", "", {attachments: attachments}); 

Получите документацию OAuth и токен отсюда https://developers.google.com/accounts/docs/OAuth2

Последняя рабочая версия приведена ниже. Основываясь на этом примере, то есть аналогично предыдущему ответу, но использует учетную запись Google Service, которая не требует, чтобы человек шел по ссылке, чтобы получить токен. Вам нужно установить библиотеку Oath из Google, инструкции довольно ясны.

 var PRIVATE_KEY = 'xxx' var CLIENT_EMAIL = 'xxx'; var USER_EMAIL=Session.getActiveUser().getEmail() function getOathService() { return OAuth2.createService('GoogleDrive:' + USER_EMAIL) // Set the endpoint URL. .setTokenUrl('https://accounts.google.com/o/oauth2/token') // Set the private key and issuer. .setPrivateKey(PRIVATE_KEY) .setIssuer(CLIENT_EMAIL) // Set the name of the user to impersonate. This will only work for // Google Apps for Work/EDU accounts whose admin has setup domain-wide // delegation: // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority .setSubject(USER_EMAIL) // Set the property store where authorized tokens should be persisted. .setPropertyStore(PropertiesService.getScriptProperties()) // Set the scope. This must match one of the scopes configured during the // setup of domain-wide delegation. .setScope('https://www.googleapis.com/auth/drive'); } function sendEmail() { var oathService = getOathService(); var ssID = SpreadsheetApp.getActiveSpreadsheet().getId(); var file = Drive.Files.get(ssID ); var url = file.exportLinks[MimeType.MICROSOFT_EXCEL]; var file = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + oathService.getAccessToken() } }); var attachments = [{ fileName:'xxx.xls',//TODO DATE content: file.getBlob().getBytes(), mimeType:"application//xls", headers: { Authorization: 'Bearer ' + oathService.getAccessToken() } }]; MailApp.sendEmail('[email protected]', 'xxx', 'Hi,\n\nPlease see the last data in attachment',{attachments:attachments}); } 

Поскольку я провел около четырех часов игры в Rumpelstiltskin, потому что ни один из типично очень старых fragmentов кода для старых версий электронных таблиц и старого OAUTH вы не можете найти, когда googling «скрипт google docs отправляет excel-приложение» или аналогичный (т. Е. Вы хотите использовать существующий Таблицу, преобразовать ее в формат Excel и отправить ее как вложение электронной почты) на самом деле работал, я, наконец, нашел решение.

Чтобы создать фактический контент вложений, не выполнялись ни функции res.getContent (), ни res.getBlob (), ни res.getBytes. Эти намеки вводят в заблуждение!

Единственное, что работает для меня, – response.getBlob (). GetContent ()!

Весь код:

 function sendCurrentDocAsEmail() { var driveService = getDriveService(); var ssID = SpreadsheetApp.getActiveSpreadsheet().getId(); var sheetName = SpreadsheetApp.getActiveSpreadsheet().getName(); var email = "[email protected]" var subject = "Here be Subjects"; var body = "Don't even think about learning how to code. It's wasted time."; var file = Drive.Files.get(ssID ); var url = file.exportLinks[MimeType.MICROSOFT_EXCEL]; var response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + driveService.getAccessToken() } }); var attachments = [{ fileName:sheetName+".xlsx", content: response.getBlob().getBytes(), // this single line has cost me hours! mimeType:"application//xls", headers: { Authorization: 'Bearer ' + driveService.getAccessToken() } }]; MailApp.sendEmail(email,subject ,body, {attachments:attachments}); } 

Где getDriveService () – это функция из скрипта Google OAuth2 для приложений Scriptme на https://github.com/googlesamples/apps-script-oauth2

Используйте следующий fragment кода после его изменения в соответствии с вашими потребностями

 var file = DocsList.getFileById(FILE_ID); var attachment = file.getAs('application/vnd.ms-excel'); MailApp.sendEmail("[email protected]", "Subject", " Body" , {"fileName": "Your_file_name" , "mimeType" : "application/vnd.ms-excel" , "content":attachment.getBytes() } ); 

Обратите внимание, что этот код не проверен, поэтому, пожалуйста, не стесняйтесь исправить ошибку или два, которые могут появиться

Interesting Posts

Сравнение BSXFUN и REPMAT

JSON.Net: принудительная сериализация всех частных полей и всех полей в подclassах

Отслеживание положения прокрутки и уведомление об этом других компонентах

d3.js v4: Как получить доступ к исходному индексу родительской группы?

Не удалось запустить службу установщика Windows

Получить индекс элемента как дочернего по отношению к родительскому

Svchost.exe, используя большую память, замедляющую мой компьютер

Как принудительно удалить файл в Windows 7?

Лучший способ конвертировать ArrayList в строку

Что означает этот свет, похожий на цилиндр?

Именованные параметры в JDBC

Аккумулятор ноутбука заряжается, но больше не заряжается

Ярлык для «null, если объект имеет значение null, или object.member, если объект не является нулевым»

Есть ли какие-либо преимущества в производительности от дефрагментации накопителя USB?

Firebase (FCM): открывать активность и передавать данные по уведомлению. андроид

Давайте будем гением компьютера.