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 в ближайшее время.

Перед запуском скрипта надо убедиться, что значения в третьем столбце похожи на те, которые изображены на скриншоте.
idinthirdcolumn

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);
    }
  }
}

©  iphones.ru