time management

Учёт рабочего времени в Google Docs

В целях повышения личной эффективности я решил вести учёт своего рабочего времени. Цели:

  • Узнать, сколько тратится рабочих минут…
  • … и на какие задачи,
  • как распределяется время отдыха,
  • плюс самоконтроль.

Pomodoro

Сразу отмечу, что техника Pomodoro мне не подошла. Тест-драйв был больше месяца, но я понял, что:

  • чётко регламентированное время некстати выводит из т.н. «состояния потока»;
  • ожидание таймера расслабляет (если осталось две минуты, работаешь не так эффективно);
  • да, на часы можно и не смотреть, но тогда срабатывание таймера — мини-стресс; плюс см. первый пункт.

IFTTT

Поэтому решено было следовать за своим ритмом работы, а корректировки вносить по достигнутым результатам и анализу затраченного времени. Первое, что пришло в голову — это ведение таблицы в Google Spreadsheets плюс автоматизация. С первым компонентом всё очевидно, а вот автоматизировать добавление времени мне помогла программа Do Button от сервиса IFTTT (If This Then That). Оказалось, что там уже есть готовый «рецепт», позволяющий вести нужную таблицу, вставляя записи по нажатию на кнопку-виджет.

Примечание: в настоящее время функциональность программы Do Button, ранее поставлявшейся отдельно, интегрирована в программу IFTTT, а «рецепты» стали называться «апплетами».

Ссылки на IFTTT:
App StoreGoogle Play

Свой скрипт

Всё было хорошо ровно до тех пор, пока таблица не выросла до 2000 строк. После этого при нажатии на Do-кнопку создавался новый файл. Для меня это было неприемлемо, т.к. на соседних листах документа велась статистика по неделям, месяцам и проектам (типам задач).

Пришлось написать свой скрипт для Google Docs, который делал бы всё то же самое, что и Do-кнопка. В качестве бонуса — теперь нет необходимости прикасаться к телефону для вставки строк в таблицу.

// Глобальные переменные:
var ss = SpreadsheetApp.getActive();

// Создаём кнопку в меню таблицы:
function onOpen() {
  var menu = [{name:"Add WorkHours row", functionName:"addWorkHoursRow"}];
  ss.addMenu("Extra", menu);
}

// Функция, которая работает при нажатии кнопки:
function addWorkHoursRow() {
  var sh = ss.getActiveSheet();
  var lRow = sh.getLastRow();
  var lCol = sh.getLastColumn();
  var range = sh.getRange(lRow+1,1,1,lCol);
  var currentTime = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MMMM dd',' yyyy' at 'hh:mma");
  var values = [
    [
      currentTime,
      '=DATEVALUE(REGEXEXTRACT(INDIRECT(ADDRESS(ROW(),COLUMN()-1,4)), "\\w+ \\d{2}, \\d{4}"))',
      '=YEAR(INDIRECT(ADDRESS(ROW(),COLUMN()-1,4))) & "-" & TEXT(WEEKNUM(INDIRECT(ADDRESS(ROW(),COLUMN()-1,4))),"00")',
      '=YEAR(INDIRECT(ADDRESS(ROW(),COLUMN()-2,4))) & "-" & TEXT(MONTH(INDIRECT(ADDRESS(ROW(),COLUMN()-2,4))),"00")',
      '=IF(ISEVEN(ROW()), "Started", "Stopped")',
      '=IF(ISODD(ROW()),ROUND(((DATEVALUE(REGEXEXTRACT(INDIRECT(ADDRESS(ROW(),COLUMN()-5,4)), "\\w+ \\d{2}, \\d{4}")) + TIMEVALUE(REGEXEXTRACT(INDIRECT(ADDRESS(ROW(),COLUMN()-5,4)), "\\d{2}:\\d{2}[A|P]M$"))) - ( DATEVALUE(REGEXEXTRACT(INDIRECT(ADDRESS(ROW()-1,COLUMN()-5,4)), "\\w+ \\d{2}, \\d{4}")) + TIMEVALUE(REGEXEXTRACT(INDIRECT(ADDRESS(ROW()-1,COLUMN()-5,4)), "\\d{2}:\\d{2}[A|P]M$")))), 6),"")',
      "",
      ""
    ]
  ];

  sh.insertRowsAfter(lRow, 1);
  range.setValues(values);
}

Читатель, знакомый со скриптами Google Docs, сразу увидит тут несколько усложнений. Особенно это касается формата и обработки даты / времени. В моём случае это было оправданно, т.к. мне нужно было продолжать исходную таблицу. Но вы — в качестве небольшого домашнего задания — можете оптимизировать формулы Google Docs.

Работает всё просто: в таблицу вставляется время начала или окончания задачи, остальные поля рассчитываются автоматически, а последние два оставляются пустыми — для заполнения вручную.

table
Пример таблицы, изображение кликабельно

Как видите, в таблице 8 столбцов:

  • Дата и время в определённом формате
  • Дата
  • Неделя
  • Месяц (эта и две предыдущие колонки нужны для отчёта за соответствующие периоды)
  • Статус выполнения задачи
  • Длительность задачи
  • Тип задачи (или проект)
  • Описание задачи

Последние два столбца не заполняются автоматически. Хотя «тип задачи», наверное, и можно заполнять с помощью отдельных кнопок меню Extra, если список этих типов ограничен. Я не стал заморачиваться, хотя за 5 месяцев использования таблицы у меня и сформировался практически неизменный список из десятка типов.

Как я и говорил, на соседних листах с помощью сводных таблиц ведётся статистика на основе данных первого листа. Например, вот диаграмма распределения рабочего времени по проектам:

Круговая диаграмма

А что ещё?

В качестве курьёза: есть (или планируется к выпуску) очень интересный девайс для учёта времени. Для моего количества проектов aka типов задач мне вполне хватило бы восьми его граней 😉

ZEI
Клик по картинке приведёт на страничку проекта.

Спасибо за внимание и всего хорошего!