Время на прочтение
2 мин
Количество просмотров 5.7K
Ранее я публиковал уже пример генерации суммы прописью с помощью новых сервисов Google Spreadsheets
habrahabr.ru/blogs/google/104057
Теперь реализована также функция проверки правильности ввода ИНН.
Открыть таблицу https://spreadsheets.google.com/ccc?key=0AppCRCbx33I9dG1rM2lmSW56VmFVeVBmZng0dE5jcmc&hl=en
Просто скопируйте таблицу в свой аккаунт и введите =is_valid_inn(A3) со ссылкой на значение в требуемое поле
Источник кода
Copy Source | Copy HTML
- // Функция для проверки правильности ИНН
- function is_valid_inn(i)
- {
- i += '';
- if ( i.match(/D/) ) return false;
- var inn = i.match(/(d)/g);
- if ( inn.length == 10 )
- {
- return inn[9] == String(((
- 2*inn[ 0] + 4*inn[1] + 10*inn[2] +
- 3*inn[3] + 5*inn[4] + 9*inn[5] +
- 4*inn[6] + 6*inn[7] + 8*inn[8]
- ) % 11) % 10);
- }
- else if ( inn.length == 12 )
- {
- return inn[10] == String(((
- 7*inn[ 0] + 2*inn[1] + 4*inn[2] +
- 10*inn[3] + 3*inn[4] + 5*inn[5] +
- 9*inn[6] + 4*inn[7] + 6*inn[8] +
- 8*inn[9]
- ) % 11) % 10) && inn[11] == String(((
- 3*inn[ 0] + 7*inn[1] + 2*inn[2] +
- 4*inn[3] + 10*inn[4] + 3*inn[5] +
- 5*inn[6] + 9*inn[7] + 4*inn[8] +
- 6*inn[9] + 8*inn[10]
- ) % 11) % 10);
- }
- return false;
- }
news.eastgeology.com/2010/09/google-spreadsheets_19.html — пример внедренной таблицы
Простой инструмент, который может экономить время.
Так уж вышло, что мы реализовали почти 500 проектов в «Google Таблицах» и очень хорошо разбираемся в них. Можно прочитать про нас на сайте Helpexcel.pro.
Рабочие процессы многих компаний связаны с таблицами. И все их используют для разных целей. Кто-то для подготовки отчётов, кто-то ведёт реестр продаж, кто-то совершает расчёты и готовит смету для клиента. Разных бизнес-задач в «Google Таблицах» множество.
Не больше 20% от всех процессов в таблицах выстроены рациональным образом и не доставляют лишних проблем тем, кто с ними работает
Одна из частых проблем — автозаполнение документов. Договоры заключаются в каждой компании, и от структуры договора или пакета документов зависят трудозатраты. Как правило, это подстановка данных в шаблоны. То есть пользователь вставляет в определённые места типового документа переменные параметры. Решить задачу можно довольно просто.
Как работает
Заполняем строку таблицы переменными договора
Наименование организации, сумма, условия. У каждого эти поля будут свои.
Создаём копию шаблона
В соответствующей ячейке шаблона меняем номер договора
На соседнем листе формируется договор
Выводим на печать или сохраняем в нужном формате, например в PDF
Решается сразу несколько проблем:
- Данные всех договоров в одном реестре.
- Организованное хранение документов.
- Минимизация временных трудозатрат.
Как сделать автозаполнение самостоятельно
Все решается за счёт двух формул. Просто нужно посмотреть на процесс немного иначе.
Создаем таблицу реестра документов
В нём должны быть переменные поля документов, которые нам нужно заполнять.
Переносим договор для автозаполнения в «Google Таблицу»
Подгоняем форматирование под требуемый конечный вид документ. Переменные поля нужно разместить в отдельных ячейках, чтобы можно было на них ссылаться формулами. Самое сложное тут — поработать с форматированием документа.
Формулой IMPORTRANGE нужно подтянуть весь реестр в таблицу шаблона
Формулой ВПР подтянуть переменные величины в соответствующие поля договоры
Идентификатором при этом можно использовать номер договора, который пользователь вводить в реестре. Весь процесс выглядит так: заполнили строку реестра, ввели туда номер договора и остальные параметры → создали копию шаблона и ввели в нужном месте номер договора → шаблон заполнился данными реестра.
Папка с описанными таблицами. Скопируйте их на свой «Google Диск» (в меню: Файл → Создать копию)
Всем, кто дочитал до этого момента, отправим пошаговую инструкцию с описанием формул и реализации этого кейса.
Успехов!
Автозаполнение договоров и типовых документов
Деятельность любой организации связана с договорной работой. Важна рациональность организации документооборота в рабочих процессах. В договорах меняются одни и те же поля: реквизиты клиентов, суммы, даты, номера и тд., нужно пролистать договор и подставить нужные данные в правильном формате в нужные места.Такой способ затратный и допускает высокую вероятность ошибки
Мы же рассмотрим простой и безотказный способ быстрого заполнения документов, который может сделать каждый.
НОВЫЙ ПРОЕКТ ОТ РАЗРАБОТЧИКОВ HELPEXCEL
Будем оптимизировать работу с договором на оказание услуг
(изменяемые поля выделены желтым).
В качестве изменяемых полей будут значения из нижеприведенной таблицы 1:
Создаем папку «Договора» и в ней создаем таблицу с названием «Шаблон» и «Реестр» ( кликните на выделенные слова «шаблон» и «реестр», чтобы перейти по ссылке в таблицы)
На первом листе таблицы «Реестр» создаем таблицу с полями:
Заходим в таблицу «Шаблон» и на первом листе создаем форму ввода данных. Просто рисуем и форматируем ячейки так, как будет удобно. Далее значения из нашей формы будут подставляться в шаблон договора.
Далее в таблице «Шаблон» создаем лист «Договор» и переносим туда содержимое договора.
Изменяемые поля размещаем в отдельных ячейках и временно выделяем для удобства желтым цветом.
Перенос содержимого договора в таблицу займет большую часть времени. Нужно отнестись к этой задаче внимательно и предусмотрительно. Поскольку некоторые поля могут существенно меняться в размерах от случая к случаю, то лучше рассчитать под них поле соответствующего размера.
Можно объединять ячейки:
А так же применять инструменты для выравнивания текста:
И инструменты для форматирования:
Теперь самое главное!
Сперва определим алгоритм документооборота:
У нас есть таблица «Реестр», в ней в каждой строке содержатся данные для одного договора. Пользователь заполняет таблицу реестра:
И открывает ее.
В копии заполняется только поле «Номер договора». Данные автоматически подставляются в соответствующие места договора.
Далее создает копию шаблона:
Для того, что бы наш алгоритм работал и в шаблон можно было поставить данные любого договора нам нужно подтянуть данные в сам шаблон. Для этого воспользуемся функцией IMPORTRANGE
Функция отображает данные одной таблицы в любой другой.
В качестве аргументов задается ссылка на таблицу и диапазон отображаемых ячеек, информация отображается без форматирования.
Переходим на лист «Реестр» в таблице «Шаблон». Встаем курсором на ячейку А1 и вводим следующую формулу:
=importrange(«https://docs.google.com/s..»;»Реестр!B:O»)
Получаем массив данных реестра:
Далее с помощью функции ВПР будем подтягивать по номеру договору, который введет пользователь, данные реестра.
Вид функции: =ВПР(Искомое значение; диапазон в котором осуществляется поиск; номер столбца из которого возвращается значение; точность совпадений (в 99,99% случаев указываем «0» (нуль))
На листе «Данные» встаем на ячейку С4 и вводим формулу:
=ВПР(C3;’Реестр‘!A:N;2;0)
В ячейке С4 появится значение:
Н/Д – нет данных. Значение отображается потому что в таблице не найдено пустого значения. Что бы все было красиво и без ошибок включим формулу ЕСЛИОШИБКА
Вид функции: =ЕСЛИОШИБКА(Значение если нет ошибка; Значение если ошибка)
Таким образом наша формула примет следующий вид:
=ЕСЛИОШИБКА(ВПР(C3;’Реестр‘!A:N;2;0);»»)
Аналогичным образом пропишем формулы для всех полей. Для того, чтобы сделать это быстро, скопируем формулу из строки формул и вставим в нужные поля, изменяя порядковый номер столбца из которого подтягиваются данные:
Теперь введем номер одного из имеющихся в реестре договоров и получим заполненную форму:
Теперь осталось подставить полученные данные в шаблон договора.
В ячейке для номера договора вводим формулу: =‘Данные’!C3
Таким образом ссылаемся на соответствующее поле на листе «Данные».
В поле даты договора вводим формулу: =СЕГОДНЯ()
В шаблоне всегда будет фигурировать текущая дата.
В ячейку юридического статуса вводим формулу: =‘Данные’!C8
А вот ячейка для ФИО состоит из трех полей на листе «Данные». Поэтому воспользуемся простой текстовой функцией СЦЕПИТЬ и получим такую формулу:
=СЦЕПИТЬ(‘Данные’!C11;» «;‘Данные’!C12;» «;‘Данные’!C13)
Следующее поле, которое нужно заполнить – это сумма договора.
Вводим формулу: =’Данные’!C4
В соседнем поле нужно вывести сумму прописью. Поскольку стандартным функционалом Гугл Таблиц не это не предусмотрено, воспользуемся готовым решением.
Заходим в редактор скриптов:
И вставляем фрагмент нижеприведенного кода:
var mapNumbers = {
0 : [2, 1, «ноль»],
1 : [0, 2, «один», «одна»],
2 : [1, 2, «два», «две»],
3 : [1, 1, «три»],
4 : [1, 1, «четыре»],
5 : [2, 1, «пять»],
6 : [2, 1, «шесть»],
7 : [2, 1, «семь»],
8 : [2, 1, «восемь»],
9 : [2, 1, «девять»],
10 : [2, 1, «десять»],
11 : [2, 1, «одиннадцать»],
12 : [2, 1, «двенадцать»],
13 : [2, 1, «тринадцать»],
14 : [2, 1, «четырнадцать»],
15 : [2, 1, «пятнадцать»],
16 : [2, 1, «шестнадцать»],
17 : [2, 1, «семнадцать»],
18 : [2, 1, «восемнадцать»],
19 : [2, 1, «девятнадцать»],
20 : [2, 1, «двадцать»],
30 : [2, 1, «тридцать»],
40 : [2, 1, «сорок»],
50 : [2, 1, «пятьдесят»],
60 : [2, 1, «шестьдесят»],
70 : [2, 1, «семьдесят»],
80 : [2, 1, «восемьдесят»],
90 : [2, 1, «девяносто»],
100 : [2, 1, «сто»],
200 : [2, 1, «двести»],
300 : [2, 1, «триста»],
400 : [2, 1, «четыреста»],
500 : [2, 1, «пятьсот»],
600 : [2, 1, «шестьсот»],
700 : [2, 1, «семьсот»],
800 : [2, 1, «восемьсот»],
900 : [2, 1, «девятьсот»]
};
var mapOrders = [
{ _Gender : true, _arrStates : [«рубль», «рубля», «рублей»] },
{ _Gender : false, _arrStates : [«тысяча», «тысячи», «тысяч»] },
{ _Gender : true, _arrStates : [«миллион», «миллиона», «миллионов»] },
{ _Gender : true, _arrStates : [«миллиард», «миллиарда», «миллиардов»],
{ _Gender : true, _arrStates : [«триллион», «триллиона», «триллионов»] } ];
var objKop = { _Gender : false, _arrStates : [«копейка», «копейки», «копеек»] };
function Value(dVal, bGender) {
var xVal = mapNumbers[dVal];
if (xVal[1] == 1) {
return xVal[2];
} else {
return xVal[2 + (bGender ? 0 : 1)];
}
}
function From0To999(fValue, oObjDesc, fnAddNum, fnAddDesc)
{ var nCurrState = 2;
if (Math.floor(fValue/100) > 0) {
var fCurr = Math.floor(fValue/100)*100;
fnAddNum(Value(fCurr, oObjDesc._Gender));
nCurrState = mapNumbers[fCurr][0];
fValue -= fCurr;
}
if (fValue < 20) {
if (Math.floor(fValue) > 0) {
fnAddNum(Value(fValue, oObjDesc._Gender));
nCurrState = mapNumbers[fValue][0];
}
} else {
var fCurr = Math.floor(fValue/10)*10;
fnAddNum(Value(fCurr, oObjDesc._Gender));
nCurrState = mapNumbers[fCurr][0];
fValue -= fCurr;
if (Math.floor(fValue) > 0) {
fnAddNum(Value(fValue, oObjDesc._Gender));
nCurrState = mapNumbers[fValue][0];
}
}
fnAddDesc(oObjDesc._arrStates[nCurrState]);
}
function FloatToSamplesInWordsRus(fAmount)
{
var fInt = Math.floor(fAmount + 0.005);
var fDec = Math.floor(((fAmount — fInt) * 100) + 0.5);
var arrRet = [];
var iOrder = 0;
var arrThousands = [];
for (; fInt > 0.9999; fInt/=1000) {
arrThousands.push(Math.floor(fInt % 1000));
}
if (arrThousands.length == 0) {
arrThousands.push(0);
}
function PushToRes(strVal) {
arrRet.push(strVal); }
for (var iSouth = arrThousands.length-1; iSouth >= 0; —iSouth) {
if (arrThousands[iSouth] == 0) {
continue;
}
From0To999(arrThousands[iSouth], mapOrders[iSouth], PushToRes, PushToRes); }
if (arrThousands[0] == 0) {
// Handle zero amount
if (arrThousands.length == 1) {
PushToRes(Value(0, mapOrders[0]._Gender)); }
var nCurrState = 2;
PushToRes(mapOrders[0]._arrStates[nCurrState]);
}
if (arrRet.length > 0) {
// Capitalize first letter
arrRet[0] = arrRet[0].match(/^(.)/)[1].toLocaleUpperCase() + arrRet[0].match(/^.(.*)$/)[1]; }
arrRet.push((fDec < 10) ? («0» + fDec) : («» + fDec));
From0To999(fDec, objKop, function() {}, PushToRes);
return arrRet.join(» «);
}
Далее сохраняем и задаем название проекта:
Чтобы перевести числовую сумму в текстовый эквивалент, необходимо в таблице воспользоваться функцией =FloatToSamplesInWordsRus() и в скобках указать адрес ячейки, в которой у нас хранится числовая сумма.
Введем формулу со ссылкой на сумму:
=FloatToSamplesInWordsRus(A57)
Получим искомое значение:
Дальше прописываем формулы для реквизитов:
Поле наименование содержит данные из двух ячеек формы: юридический статус и наименование.
Поле «юридический статус» в реквизитах нам нужно указать в формате сокращенной аббревиатуры, поэтому предусмотрим все возможные вариации на листе «Данные» и воспользуемся логической функцией ЕСЛИ
Функция ЕСЛИ проверяет ячейку на совпадение с задаваемыми условиями и возвращает одно значение в случае совпадения и другое в противном случае.
Вид функции: =ЕСЛИ(условие; значение если истина; значение если ложь)
В нашем случае функция будет иметь следующий вид:
=ЕСЛИ(C8=«ИП»;«ИП»;ЕСЛИ(C8=«общество с ограниченной ответственностью»;«ООО»;C8))
Вставим ее рядом с полем «Юридический статус» на листе «Данные»:
Вернемся к реквизитам.
Теперь в поле наименования можно ввести формулу со ссылкой на две ячейки листа «Данные»:
=СЦЕПИТЬ(‘Данные’!D8;» «;‘Данные’!C9)
И прописываем ссылки на остальные реквизиты. Получаем искомый результат:
Осталось заполнить место для подписи фамилией и инициалами. Для этого воспользуемся функцией ЛЕВСИМВ
Функция ЛЕВСИМВ отображает заданное количество знаков с левого края значения ячейки.
Вид функции: =ЛЕВСИМВ(значение; количество знаков)
Для того, что бы получить нужное нам значение, нужно воспользоваться функцией СЦЕПИТЬ в связке с ЛЕВСИМВ.
Таким образом формула будет иметь вид (рис.26):
=СЦЕПИТЬ(ЛЕВСИМВ(‘Данные’!C12;1);».»;ЛЕВСИМВ(‘Данные’!C13;1);». «;‘Данные’!C11)
Теперь, когда мы прописали всю логику настало время заняться приведением печатной части договора к должному виду. Убираем желтую раскраску и делаем табличную сетку невидимой.
Выделяем всю область таблицы, нажатием на ее угол.
Делаем фон однотонно – белым:
Теперь, не снимая выделения с табличной области, сделаем границы ячейки белыми:
Удаляем ненужные столбцы и строки:
Проверяем расположение границ при выводе на печать:
Если вы работаете с юридическими лицами, то вам постоянно приходится заполнять реквизиты контрагентов. И скорей всего мечтаете о волшебной кнопочке, которая заполнит все за вас. В данной статье я расскажу как реализовать автоматическое заполнение реквизитов по ИНН или любым другим данным организации.
Есть замечательный сервис DaData.ru, который умеет не только исправлять контактные данные типа ФИО, адреса, телефона и т.п., удалять дубликаты, но и ищет реквизиты организаций и ИП.
Данный сервис предоставляет доступ к API и дает бесплатно до 10 тыс. запросов в день по API-ключу. Этим мы и воспользуемся, чтобы реализовать автоматическое заполнение реквизитов по ИНН.
Получение API-ключа на Dadata.ru
Для начала необходимо зарегистрироваться на сервисе DaData. После регистрации в личном кабинете можно увидеть ваш API-ключ, который будет использоваться для запросов к сервису. А еще вам будет бонус 10 рублей на счет за использование API.
Ну а теперь можем приступить к написанию скрипта для отправки запроса и обработки ответа. Напоминаю, что писать код мы будем на Javascript.
Javascript для получения и заполнение реквизитов по ИНН
Создаем форму, в которой будет происходить заполнение реквизитов:
<div class="well well-sm col-md-6"> <div class="view"> </div> <div class="view"><p>Пожалуйста, заполняйте поля как можно более подробней. Это поможет нам быстрее и точнее отреагировать на ваше сообщение.</p></div> <form action="/ method="POST"> <div class="form-group"> <label for="company">Название компании* (реквизиты заполнятся автоматически):</label> <input class="form-control" type="text" name="company" id="company" value="" placeholder="Введите название, адрес, ИНН или ОГРН" required /> </div> <div class="form-group"> <label for="inn">ИНН:</label> <input class="form-control" type="text" name="inn" id="inn" value="" placeholder="Например, 1111111111" readonly required /> </div> <div class="form-group"> <label for="kpp">КПП:</label> <input class="form-control" type="text" name="kpp" id="kpp" value="" placeholder="Например, 111111111" readonly /> </div> <div class="form-group"> <label for="ogrn">ОГРН:</label> <input class="form-control" type="text" name="ogrn" id="ogrn" value="" placeholder="Например, 1111111111111" readonly required /> </div> <div class="form-group"> <label for="address">Адрес:</label> <input class="form-control" type="text" name="address" id="address" value="" placeholder="Невский пр., 1" required /> </div> <div class="form-group"> <label for="tel">Телефон для связи*:</label> <input class="form-control" type="text" name="tel" id="tel" value="" placeholder="Например, +7 812 111 1111" required /> </div> <div class="form-group"> <label for="email">Ваш email*:</label> <input class="form-control" type="text" name="email" id="email" value="" placeholder="Например, [email protected]" required /> </div> <div class="form-group"> <label for="url">Сайт:</label> <input class="form-control" type="text" name="url" id="url" value="" placeholder="Например, pogrommist.ru" /> </div> <div class="form-group"> <label for="comment">Дополнительные сведения:</label> <textarea class="form-control" type="text" name="comment" id="comment" rows="4" /></textarea> </div> <div class="form-group"> <div class="g-recaptcha" data-sitekey="тут ключ для капчи"></div> </div> <div class="form-group"> <button type="submit" name="addevent" class="btn btn-default">Отправить</button> </div> </form> </div>
Выглядеть наша форма будет примерно так:
Также нам понадобятся дополнительные стили и библиотеки:
<link href="https://cdn.jsdelivr.net/jquery.suggestions/17.2/css/suggestions.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <!--[if lt IE 10]> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js"></script> <![endif]--> <script type="text/javascript" src="https://cdn.jsdelivr.net/jquery.suggestions/17.2/js/jquery.suggestions.min.js"></script>
Теперь пишем код, который будет отправлять запросы по мере заполнения первой графы и обрабатывать ответы.
<script> function join(arr) { var separator = arguments.length > 1 ? arguments[1] : ", "; return arr.filter(function(n){return n}).join(separator); } function typeDescription(type) { var TYPES = { 'INDIVIDUAL': 'Индивидуальный предприниматель', 'LEGAL': 'Организация' } return TYPES[type]; } function showSuggestion(suggestion) { console.log(suggestion); var data = suggestion.data; if (!data) return; $("#type").text( typeDescription(data.type) + " (" + data.type + ")" ); if (data.name) //$("#company").val(join([data.opf && data.opf.short || "", data.name.short || data.name.full], " ")); $("#inn").val(data.inn); $("#kpp").val(data.kpp); $("#ogrn").val(data.ogrn); if (data.address) $("#address").val(data.address.value); } $("#company").suggestions({ token: "Здесь должен быть ваш API-ключ", type: "PARTY", count: 5, onSelect: showSuggestion }); </script>
При заполнении первой графы будут предложены 5 подсказок, за это отвечает переменная «count». Максимально можно выводить до 20 подсказок. При выборе одной из них в нашем варианте будут заполняться поля «Название компании», «ИНН», «ОГРН» и «адрес».
Какие данные еще можно получить?
Название | Описание |
---|---|
value | Наименование компании одной строкой (как показывается в списке подсказок) |
unrestricted_value | Наименование компании одной строкой (полное) |
data.address.value | Адрес одной строкой:
Стандартизован, поэтому может отличаться от записанного в ЕГРЮЛ. |
data.address.unrestricted_value | Адрес одной строкой (полный, от региона) Стандартизован, поэтому может отличаться от записанного в ЕГРЮЛ. |
data.address.data | Гранулярный адрес. Может отсутствовать |
data.address.data.source | Адрес одной строкой как в ЕГРЮЛ |
data.branch_count | Количество филиалов |
data.branch_type | Тип подразделения
MAIN — головная организация BRANCH — филиал |
data.inn | ИНН |
data.kpp | КПП |
data.ogrn | ОГРН |
data.ogrn_date | Дата выдачи ОГРН |
data.hid | Уникальный идентификатор в Дадате |
data.management.name | ФИО руководителя |
data.management.post | Должность руководителя |
data.name.full_with_opf | Полное наименование с ОПФ |
data.name.short_with_opf | Краткое наименование с ОПФ |
data.name.latin | Наименование на латинице |
data.name.full | Полное наименование |
data.name.short | Краткое наименование |
data.okpo | Код ОКПО (не заполняется) |
data.okved | Код ОКВЭД |
data.okved_type | Версия справочника ОКВЭД (2001 или 2014) |
data.okveds | Коды ОКВЭД дополнительных видов деятельности (не заполняется) |
data.opf.code | Код ОКОПФ |
data.opf.full | Полное название ОПФ |
data.opf.short | Краткое название ОПФ |
data.opf.type | Не используется |
data.state.actuality_date | Дата актуальности сведений |
data.state.registration_date | Дата регистрации |
data.state.liquidation_date | Дата ликвидации |
data.state.status | Статус организации
ACTIVE — действующая LIQUIDATING — ликвидируется LIQUIDATED — ликвидирована |
data.type | Тип организации
LEGAL — юридическое лицо INDIVIDUAL — индивидуальный предприниматель |
data.capital | Уставной капитал, для организаций (не заполняется) |
data.citizenship | Гражданство, для ИП (не заполняется) |
data.authorities | Руководители, доверенные лица, управляющие организации (не заполняется) |
data.documents | Документы (не заполняется) |
data.licenses | Лицензии (не заполняется) |
data.phones | Телефоны (не заполняется) |
data.emails | Адреса эл. почты (не заполняется) |
data.source | Не используется |
data.qc | Не используется |
Данный сервис можно использовать для заполнения реквизитов контрагентов в 1С. Возможно в будущем я опишу как это реализовать в 1С:Бухгалтерия 3.0.
Гугл таблицы — это очень мощный инструмент, но большинство людей его используют лишь просто как просмотрщик exel документов у себя в почте gmail или на гугл диске. Раньше я его так же использовал только для подобных целей. Однако это полноценный аналог экселя, даже возможно более функциональный и совершенно бесплатный.
Плюсов в работе с google таблицами много, вот только те немногие которые мне очень понравились:
- Возможность легко расшарить документ
- Разграничение прав
- Бесплатно
- Разграничение прав вплоть до каждой ячейки!
- Поддержка макросов
- Возможность написания собственных скриптов
- Доступно с любой платформы, хоть с древней нокии можно открыть и посмотреть документ.
Про собственные скрипты остановимся поподробнее и напишем простой скрипт для автоматической установки даты в определенные ячейки.
Задача:
Подскажите пожалуйста формулу для автоматической подстановки даты или времени в необходимую мне ячейку. к примеру. в ячейке А1 я пишу Иванов, в ячейке В1 автоматически подставляется текущая дата или время. далее пишу в ячейке А2 Петров, в ячейке В2 автоматически пишется дата текущая или время.
Как решить такую задачу в Exel можно найти кучу способов и примеров в интернете, но проблема в том что все они не работают в гугл таблицах. Не работают потому что там немного другой синтаксис скриптов. Подробнее ознакомиться с ним можно в справке самого гугла. А чтобы было проще разобраться я покажу на примере как решить эту задачку в Google таблицах.
Если вкратце, то нужно создать функцию которая срабатывает в момент редактирования определенной ячейки. Для примера, предположим что нам нужно при добавлении записи в ячейку 17 автоматически подставлять текущую дату в ячейку номер 2, а так же текущее время в ячейку номер 3. Ещё немного усложним задачу и сделаем проверку, если в соседней ячейке уже есть какая-то запись, то данные не обновлять и не менять дату и время.
function onEdit(e) { var sheet = e.source.getActiveSheet(); var idCol = e.range.getColumn(); var idRow = e.range.getRow(); if ( idCol == 17 && sheet.getName() =='Страница1' ) { // тут у меня имя листа, впишите сюда своё var Value = e.range.offset(0, -13).getValues(); // Смотрим что в ячейке с лева на 12 if ( Value == "" ) { var vartoday = getDate(); var varnow = getTime(); sheet.getRange(idRow, 2).setValue( vartoday ); sheet.getRange(idRow, 3).setValue(varnow); } } } // Returns YYYYMMDD-formatted date. function getDate() { var today = new Date(); today.setDate(today.getDate()); //return Utilities.formatDate(today, 'PST', 'yyyy.MM.dd'); return Utilities.formatDate(today, 'GMT+05:00', 'yyyy.MM.dd'); } function getTime() { var today = new Date(); today.setDate(today.getDate()); //return Utilities.formatDate(today, 'PST', 'yyyy.MM.dd'); return Utilities.formatDate(today, 'GMT+05:00', 'HH:mm'); }
Если кому-то не понятен сей скрипт, пишите в комменты, постараюсь помочь.
Пример работы с подсказками DaData в Google Taблицах
Как подключить скрипт к Гугл-таблице:
- Открыть таблицу.
- В меню выбрать Расширения > Apps Script
- Вставить код из файла
suggest-google-sheets.js
- Вместо ВАШ_API_КЛЮЧ указать API-ключ из личного кабинета (https://dadata.ru/profile/#info)
- Сохранить.
- В тулбаре выбрать функцию
guessParty
и нажать на кнопку Выполнить. - Гугл запросит «разрешения на доступ к вашим данным». Нажать «проверить разрешения», выбрать ваш гугл-аккаунт.
- Если появится окно «Эксперты Google не проверяли это приложение» — нажать на «Дополнительные настройки», затем «Перейти на страницу… (небезопасно)».
- Нажать на «Разрешить».
- Убедиться, что в журнале выполнения написано «Выполнение завершено» и нет ошибок.
- Вернуться к таблице.
- Указать в ячейке ИНН компании. Например, в ячейке A1 указать
7719402047
. - В другой ячейке вызвать функцию
guessParty
. Например, в ячейчке A2 указать=guessParty(A1)
- Увидите результат: название, ОГРН, ИНН, КПП, ОКВЭД и адрес компании.
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
// Замените на свой API-ключ из личного кабинета (https://dadata.ru/profile/#info) | |
var API_KEY = «ВАШ_API_КЛЮЧ»; | |
/*** | |
/* Не меняйте код ниже этой строчки | |
***/ | |
var FORMATTERS = { | |
party: formatParty, | |
bank: formatBank | |
} | |
function formatParty(suggestion) { | |
var party = suggestion.data; | |
return [ | |
[«Название», party.name.short_with_opf], | |
[«ОГРН», party.ogrn], | |
[«ИНН», party.inn], | |
[«КПП», party.kpp], | |
[«ОКВЭД», party.okved], | |
[«Дата регистрации», party.state.registration_date], | |
[«Адрес», party.address.value] | |
]; | |
} | |
function formatBank(suggestion) { | |
var bank = suggestion.data; | |
return [ | |
[«Название», bank.name.payment], | |
[«БИК», bank.bic], | |
[«SWIFT», bank.swift], | |
[«Адрес», bank.address.value] | |
]; | |
} | |
function guessParty(query) { | |
return guess(«party», query); | |
} | |
function guessBank(query) { | |
return guess(«bank», query); | |
} | |
function guess(type, query) { | |
if (API_KEY === «ВАШ_API_КЛЮЧ») { | |
return «Укажите ваш API-ключ в переменной API_KEY»; | |
} | |
var response = suggest(type, query); | |
if (response.suggestions.length > 0) { | |
return FORMATTERS[type](response.suggestions[0]); | |
} else { | |
return «Ничего не найдено»; | |
} | |
} | |
function suggest(type, query) { | |
var url = «https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/» + type; | |
var payload = ‘{«query»: «‘ + query + ‘»}’ | |
var headers = { | |
«Authorization»: «Token « + API_KEY | |
}; | |
var fetchArgs = { | |
method: «POST», | |
contentType: «application/json», | |
payload: payload, | |
headers: headers, | |
muteHttpExceptions: false | |
}; | |
return JSON.parse(UrlFetchApp.fetch(url, fetchArgs)); | |
} |
Google Docs Editors Help
Sign in
Google Help
- Help Center
- Community
- Google Docs Editors
- Privacy Policy
- Terms of Service
- Submit feedback
Send feedback on…
This help content & information
General Help Center experience
- Help Center
- Community
Google Docs Editors