Skip to content

Commit

Permalink
Init
Browse files Browse the repository at this point in the history
  • Loading branch information
vsuharnikov committed Jan 20, 2015
1 parent a7c3e9a commit 079f711
Show file tree
Hide file tree
Showing 10 changed files with 1,171 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules

*.i*

19 changes: 19 additions & 0 deletions Gruntfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
//
'gs-import': {
options: {
destDir: 'src',
importFilePath: 'dist/graffity.json'
}
},
'gs-export': {
options: {
srcDir: 'src',
exportDir: 'dist',
filePrefix: 'graffity'
}
}
});
};
83 changes: 83 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
Отчеты о выполненной работе в _Google Drive_.

Примеры генерации ежемесячных отчетов c учетом праздников и предпраздничных дней.

Создание проекта
================

1. Необходимо удостовериться, установлен ли _Google Apps Script_ в вашем _Google Drive_.

1. Заходим на главную страницу _Google Drive_;
2. Жмем _Создать_. Если пункта _Скрипт_ нет, значит не установлен;
3. Для установки жмем "Подключить другие приложения", вводим в поиск "Google Apps Script" и жмем _Подключить_;

2. Жмем _Создать_, выбираем _Скрипт_.
3. К сожалению, импорта по аналогии с экспортом (в формате _JSON_) нет.
Поэтому придется вручную создавать файлы с помощью. _Файл__Создать__Скрипт_.
4. Создаем скрипты аналогичные тем, что в папке _src_ (обратите внимание, что расширение будет _.gs_) и копируем в них содержимое.
5. Сохраняем проект (Название не важно).

Получение ключа проекта
=======================

1. Открываем проект;
2. В меню: _Файл__Свойства проекта_;
3. В первой вкладке ("Информация"): _Project key_.

Установка
=========

Установка выполняется единожды для каждого отчета.

Действия администоратора
------------------------

Администратор выполняет основную работу.
Для выполнения установки ему необходимо получить ключ проекта (см. выше).

1. Открываем документ с отчетами пользователя (документ _Google Spreadsheets_);
2. В меню: _Инструменты__Редактор скриптов_. Откроется новый документ и появится окно. Жмем на кнопку _Закрыть_;
3. В меню: _Ресурсы__Библиотеки_. Появится диалог с предложением переименовать проект.

1. Вводим какое-нибудь осмысленное название, например, _Отчеты Филлипа Дж. Фрая_;
2. Жмем _Ok_;

4. В "Поиск библиотеки" вбиваем ключ проекта (_Project key_), жмем _Выбрать_. Найдется библиотека. Далее:

1. Выбираем самую последнюю версию;
2. В идентификаторе должно быть написано _googleReports_ (именно такое название, см. ниже);
3. Жмем _Режим разработки_ (чтобы всегда загружался последний код);
4. Жмем _Сохранить_.

5. Заменяем код исходника на:

```
function onOpen() {
googleReports.Register({
menuTitle: 'Отчеты',
importName: 'googleReports'
});
}
```
6. Жмем _Сохранить_.
Действия пользователя
---------------------
Выполняется единожды.
1. Открываем свой отчет;
2. В меню: _Инструменты_ → _Редактор скриптов_. Откроется редактор скриптов.
3. Жмем _Выполнить_ (треугольник рядом с жуком). Потребуется авторизация для скрипта.
1. Жмем _Продолжить_;
2. Жмем _Принять_.
4. В документе _Google Spreadsheet_ появится новый пункт меню.
5. При повторном открытии документа выполнять данные действия не понадобится, пункт в меню появится автоматически.
Обновление
==========
Просто сохраняем изменения в скрипте. Пользователям потребуется лишь обновить страницу.
15 changes: 15 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "google-reports",
"version": "0.0.1",
"description": "Srcipts for generating reports at Google Spreadsheets",
"main": "Gruntfile.js",
"keywords": [
"google",
"reports"
],
"author": "Vyatcheslav Suharnikov",
"license": "MIT",
"devDependencies": {
"grunt": "^0.4.5"
}
}
46 changes: 46 additions & 0 deletions src/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/**
* Регистрация пунктов меню в текущей таблице.
*
* @param {Object} options Настройки.
*
* @option options {string} menuTitle Заголовок в меню.
* @option options {string} importName Наименование библиотеки, указанное при подключении.
*/
function Register(options) {
reports.general.ensureReport();

// Почему функции находятся в "reports."?
// Потому что это - глобальный объект (указывается при настройке), в который загружаются скрипты из проекта.
SpreadsheetApp.getUi()
.createMenu(options.menuTitle)
.addItem('Общий - Скрыть дни', options.importName + '.General_hideDays')
.addItem('Общий - Скрыть минуты', options.importName + '.General_hideMinutes')
.addSeparator()
.addItem('Ежемесячный - Текущий', options.importName + '.Monthly_createForCurrent')
.addItem('Ежемесячный - Следующий', options.importName + '.Monthly_createForNext')
.addToUi();
}

// В виду ограничений функции addItem.

function General_hideMinutes() {
reports.general.hideMinutes();
}

function General_hideDays() {
reports.general.hideDays();
}

function Monthly_createForCurrent() {
var report = new reports.Monthly(reports.Utils.getCurrentMonthFirstDayDate());
report.makeEmptyReport();

reports.general.ensureFirst();
}

function Monthly_createForNext() {
var report = new reports.Monthly(reports.Utils.getNextMonthFirstDayDate());
report.makeEmptyReport();

reports.general.ensureFirst();
}
117 changes: 117 additions & 0 deletions src/reports-general.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// Генерация главного отчета.
// Главный отчет содержит данные за все месяцы в компактном виде.

// В пространстве имен reports.
if (typeof reports === 'undefined') {
reports = {};
}

/**
* @param {Object} options Настройки.
*
* @option options {String} title Наименование заголовка.
*
* @constructor
* @author Vyatcheslav Suharnikov <[email protected]>
*/
reports.General = function (options) {
if (!options) {
options = {};
}

this._title = options.title || 'Отчет'; // Наименование для листа с отчетом.
this._sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(this._title);
};

reports.General.prototype = {
ensureFirst: function () {
reports.Utils.ensureSheetIndex(this._sheet, 0);
},

hideDays: function () {
var sheet = this._sheet;

// getMaxRows
},

hideMinutes: function () {
var sheet = this._sheet;

sheet.hideColumn(sheet.getRange(2, 6, sheet.getMaxRows() - 1, 1));
},

ensureReport: function () {
if (!this._sheet) {
this._sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(this._title, 0);
this._prepareSheet(); // delete this
}

this.hideDays();
this.ensureFirst();
},

_prepareSheet: function () {
this._createHeader(1, 1);
},

_createHeader: function (startRow, startColumn) {
var sheet = this._sheet,
columnWidths = [
75, // Дата.
120, // Проект.
460, // Задача.
65, // Начало.
65, // Конец.
65, // Минут.
580 // Комментарий.
],
columnCount = columnWidths.length;

for (var columnIndex = 0; columnIndex < columnCount; columnIndex++) {
sheet.setColumnWidth(startColumn + columnIndex, columnWidths[columnIndex]);
}

sheet.getRange(startRow, startColumn, 1, columnCount)
.setValues([
['Дата', 'Проект', 'Задача', 'Начало', 'Конец', 'Минут', 'Комментарий']
])
.setFontWeight('bold')
.setHorizontalAlignment('center')
.setBackground('#969696')
.setFontColor('#fff')
.setFontSize(12);

sheet.setFrozenRows(startRow);

// Задаем форматирование ячеек.
var lastRow = sheet.getMaxRows() - startRow;

// Дата.
sheet.getRange(startRow + 1, startColumn, lastRow, 1)
.setNumberFormat('dd.MM.YYYY')
.setHorizontalAlignment('center');

// Проект.
sheet.getRange(startRow + 1, startColumn + 1, lastRow, 1)
.setHorizontalAlignment('center');

// Начало, Конец.
sheet.getRange(startRow + 1, startColumn + 3, lastRow, 2)
.setNumberFormat('00:00')
.setHorizontalAlignment('center');

// Формулы.
sheet.getRange(startRow + 1, startColumn + 5, lastRow, 1)
.setFormulaR1C1('=HOUR(R[0]C[-1]-R[0]C[-2])*60 + MINUTE(R[0]C[-1]-R[0]C[-2])');

// Скрываем столбец с минутами.
this.hideMinutes();

// Удаляем лишние столбцы.
if (sheet.getMaxColumns() - columnCount > 0) {
sheet.deleteColumns(startColumn + columnCount, sheet.getMaxColumns() - columnCount);
}
}
};

reports.general = new reports.General();
Loading

0 comments on commit 079f711

Please sign in to comment.