-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a7c3e9a
commit 079f711
Showing
10 changed files
with
1,171 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
node_modules | ||
|
||
*.i* | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' | ||
} | ||
} | ||
}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. При повторном открытии документа выполнять данные действия не понадобится, пункт в меню появится автоматически. | ||
Обновление | ||
========== | ||
Просто сохраняем изменения в скрипте. Пользователям потребуется лишь обновить страницу. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
Oops, something went wrong.