Скрипт Google Apps для электронной почты.
Я хотел бы написать скрипт приложений, чтобы отправить версию Excel моей электронной таблицы Excel. Я знаю, что могу сохранить таблицу в виде файла Excel. Я не уверен, могу ли я использовать скрипт для отправки по электронной почте версии excel в качестве вложения. Как это может быть сделано?
- Создание zip-файла на диске Google с помощью скрипта приложений
- Превышено максимальное время выполнения в Google Apps Script
- Самый простой способ получить идентификатор файла из URL-адреса в скрипте Google Apps
- Скрипты приложений Google: электронная почта в виде таблицы Excel
- Передача права собственности на файл другому пользователю в скрипте Google Apps
- Как я могу создать многостраничный текстовый документ из одного шаблона страницы в скрипте google-apps?
После ответа на другое недавнее сообщение ( 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() } );
Обратите внимание, что этот код не проверен, поэтому, пожалуйста, не стесняйтесь исправить ошибку или два, которые могут появиться