Google Apps Script для Docs в примерах
Изучаем основные приемы взаимодействия Google Apps Script с Документами.
Это наша вторая статья про Google Apps Script — подвиде JavaScript, обогащенном классами и методами для работы с сервисами Google. В первой четыре готовых рецепта, код которых можно вставить в редактор в практически неизменном виде, запустить и мгновенно получить PROFIT.
У этого материала несколько другая задача. Приведенные ниже примеры кода, предназначены скорее для обучения и размышления, чем для быстрого решения проблем. На основе приемов, использованных в этих скриптах можно составить множество классных программ для эффективного решения задач автоматизации работы с Docs. Чтобы не повторяться, для ознакомления с основами использования GAS рекомендуем прочитать статью 4 лайфхака Gmail и Google Apps Script.
Автоматическая генерация документов
Предположим, что вам нужно собрать отзывы о каком-либо событии от всех своих коллег и чтобы один сотрудник не мог видеть записи другого. Один из способов это сделать — создать для каждого человека файл в Google Docs и открыть доступ ему одному.
Для этого создаем новую таблицу в Google Docs, в первый столбец запишем фамилии сотрудников, а во второй их почтовые адреса. Проверяем информацию и запускаем код.
function createFiles() { currentSheet = SpreadsheetApp.getActiveSheet(); countDoc = 2; // Укажите здесь число респондентов в таблице for (i=1;i<=countDoc;i++) { //Создаем документ и записываем в него текст docName = currentSheet.getRange('A'+i).getValue(); doc = DocumentApp.create(docName); body = doc.getBody(); finalText="Расскажите о своих впечатлениях о конференции, пожалуйста"; body.appendParagraph(finalText); // Предоставляем человеку доступ к документу docEditor = currentSheet.getRange('B'+i).getValue(); doc.addEditor(docEditor); currentSheet.getRange('C'+i).setValue(doc.getId()); } }
Проверяем содержимое документов
В день дедлайна, поставленного коллегам для оставления отзывов, необходимо проверить все ли коллеги выполнили просьбу. Открывать каждый документ и смотреть что в нем — избыточная суета. Лучше прочитать все файлы скриптом и записать их содержимое в одну таблицу, чтобы единым взором оценить ситуацию.
Код выполняется из таблицы, созданной в предыдущем примере, так как в ней записаны ID нужных нам документов. С помощью Google Apps Script можно открывать файлы идентифицируя их по имени, дате создания, содержимому и т.д. Но работа с Google Drive тема отдельной подробной статьи, которая появиться на iphones.ru в ближайшее время.
Перед запуском скрипта надо убедиться, что значения в третьем столбце похожи на те, которые изображены на скриншоте.
function checkFiles() { currentSheet = SpreadsheetApp.getActiveSheet(); countDoc = 2; // Укажите здесь число респондентов в таблице for (i=1;i<=countDoc;i++) { // Открываем документ по уникальному идентификатору (в Google Drive может быть два файла с одинаковым именем в каталоге) docID = currentSheet.getRange('C'+i).getValue(); ; doc = DocumentApp.openById(docID); // Получаем его текст и записываем в четвертый столбец text = doc.getBody().getText(); currentSheet.getRange('D'+i).setValue(text); } }
Собираем текст нескольких документов в один
После того как мы удостоверились, что все коллеги оставили отзывы, необходимо собрать их все в один текстовый файл, чтобы на его основе составить итоговый отчет. Скрипт выполняется из той же таблицы, что и предыдущие два фрагмента кода.
function collectFiles() { currentSheet = SpreadsheetApp.getActiveSheet(); countDoc = 2; // Укажите здесь число респондентов в таблице finalText=""; endDoc = DocumentApp.create('Все отзывы'); for (i=1;i<=countDoc;i++) { docID = currentSheet.getRange('C'+i).getValue(); doc = DocumentApp.openById(docID); text = doc.getBody().getText(); body = endDoc.getBody(); // Вставляем в файл "Все отзывы" текст с отзывом респондента body.appendParagraph(currentSheet.getRange('A'+i).getValue() +" - " +text); } }
Автоматическое форматирование
Теперь немного оживим внешний вид нашего текста. Нечетные абзацы сделаем черным шрифтом на красном фоне, а четные жирным красным шрифтом без фона. Для этого нам надо создать два массива с параметрами стилей, перебрать абзацы один за другим, проверить их на четность/нечетность и применить к каждому соответствующий набор стилей.
function autoFormat() { doc = DocumentApp.getActiveDocument(); docText = doc.getBody(); var styleOne = {}; styleOne[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = DocumentApp.HorizontalAlignment.RIGHT; styleOne[DocumentApp.Attribute.FONT_FAMILY] = 'Arial'; styleOne[DocumentApp.Attribute.FONT_SIZE] = 16; styleOne[DocumentApp.Attribute.FOREGROUND_COLOR]="#FF0000"; var styleTwo = {}; styleOne[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = DocumentApp.HorizontalAlignment.RIGHT; styleOne[DocumentApp.Attribute.FONT_FAMILY] = 'Calibri'; styleOne[DocumentApp.Attribute.FONT_SIZE] = 14; styleOne[DocumentApp.Attribute.BOLD] = true; styleOne[DocumentApp.Attribute.BACKGROUND_COLOR]="#FF0000"; paragraphs = docText.getParagraphs(); // Перебираем все абзацы документа for (i=1; i<=paragraphs.length-1;i++) { if(i & 1) { paragraphs[i].setAttributes(styleOne); } else { paragraphs[i].setAttributes(styleTwo); } } }