Javascript — Google apps script


Содержание

Apps Script

Apps Script is a rapid application development platform that makes it fast and easy to create business applications that integrate with G Suite.

Build with Google

Code on the Web

Share your App

Get Started

Tutorials and guides to take you from writing your first script to building your application.

Example Scripts

From productivity tools to enterprise automation, see what you can build with Google Apps Script.

Developer Reference

Complete documentation with everything you need to know as you build with Google Apps Script.

Простой пример использования HTML в Google Apps Script на примере GoogleSheet

А вы знали, что в Google Apps Script можно использовать HTML страницы со скриптами (javascript) и даже JQuery(с небольшими ограничениями) — совсем как сайты? Сейчас мы покажем простой пример этого!

Итак приступим. Для примера создадим новую таблицу в GoogleSheet. В ней создадим 2 вкладки: test и problems.
На вкладке test сделаем кнопку (для удобства), по которой будет вызваться наш скрипт:

На вкладке problems сделаем таблицу с 3 столбцами — Имя, Браузер, Описание проблемы:

Теперь заходим в редактор скриптов и создаем новую HTML страницу с названием index:

На этой странице делаем простенькую форму с полями для ввода имени, выбора браузера и описания проблемы. И добавляем 2 кнопки — очистить и отправить. На отправить вешаем скрипт на нажатие кнопки — clickButton()

Выглядеть эта форма будет вот так:

Скрипт на нажатие кнопки — clickButton() — выглядит следующим образом:

Принцип действия скрипта очень прост:

Получаем ссылку на Форму и значения полей Имя и Описание проблемы:

var name = form.elements.name.value
var problem = form.elements.problem.value

Проверяем на заполненность поля Имя:

if(!checkFill(name)) <
alert(‘Не заполнено обязательное поле — ИМЯ’)
return
>
.
function checkFill(objValue) <
if(objValue.length > 0) <
return true
>
return false
>

Проверяем на заполненность поля Описание проблемы

if(!checkFill(problem)) <
alert(‘Не заполнено обязательное поле — ОПИСАНИЕ ПРОБЛЕМЫ’)
return
>
.
function checkFill(objValue) <
if(objValue.length > 0) <
return true
>
return false
>

Получаем наименование Браузера:

google.script.run
.withFailureHandler(onFailure)
.withSuccessHandler(onSuccess)
.writeProblem(name, browser, problem)

Скрипт onFalilure выводит сообщение, что произошла ошибка:

function onFailure() <
alert(‘Проблема с записью. Попробуйте еще раз’)
>

Скрипт onSuccess проверяет возвращенное значение с сервера, и если это true, то модальное окно с HTML формой закрывается специально директивой:

function onSuccess(test) <
if(test) <
google.script.host.close()
>
>

Теперь настало время написать серверный скрипт (в нашем случае — это обычный, стандартный Google Apps Script). Переименовываем автоматически созданный скрипт с названием Код на test и создаем 2 функции:

В функции test мы задаем, что из нашего файла index.html мы создаем HTMLOutput и специально командной показываем модальное окно.
В функции writeToProblem мы получаем 3 значения из HTML формы, записываем их на страницу problems и возвращаем true.
Осталось только к нашей картинке назначить скрипт test и можно проверять результаты нашей работы!

Теперь просто нажимаем на нашу кнопку, появляется форма. Заполняем форму, нажимаем отправить — и на нашей вкладке problems появляется новая запись!

Вот такой простой пример использования HTML в GoogleSheets!

Как обычно, ссылка на пример в Google Sheets:


Dev Google Apps Script для Docs в примерах

Изучаем основные приемы взаимодействия Google Apps Script с Документами.

Это наша вторая статья про Google Apps Script — подвиде JavaScript, обогащенном классами и методами для работы с сервисами Google. В первой четыре готовых рецепта, код которых можно вставить в редактор в практически неизменном виде, запустить и мгновенно получить PROFIT.

У этого материала несколько другая задача. Приведенные ниже примеры кода, предназначены скорее для обучения и размышления, чем для быстрого решения проблем. На основе приемов, использованных в этих скриптах можно составить множество классных программ для эффективного решения задач автоматизации работы с Docs. Чтобы не повторяться, для ознакомления с основами использования GAS рекомендуем прочитать статью 4 лайфхака Gmail и Google Apps Script.

Автоматическая генерация документов

Предположим, что вам нужно собрать отзывы о каком-либо событии от всех своих коллег и чтобы один сотрудник не мог видеть записи другого. Один из способов это сделать — создать для каждого человека файл в Google Docs и открыть доступ ему одному.

Для этого создаем новую таблицу в Google Docs, в первый столбец запишем фамилии сотрудников, а во второй их почтовые адреса. Проверяем информацию и запускаем код.

[jscript]function createFiles() <
currentSheet = SpreadsheetApp.getActiveSheet();
countDoc = 2; // Укажите здесь число респондентов в таблице
for (i=1;i doc = DocumentApp.openById(docID);
// Получаем его текст и записываем в четвертый столбец
text = doc.getBody().getText();
currentSheet.getRange(‘D’+i).setValue(text);
>
>[/jscript]

Собираем текст нескольких документов в один

После того как мы удостоверились, что все коллеги оставили отзывы, необходимо собрать их все в один текстовый файл, чтобы на его основе составить итоговый отчет. Скрипт выполняется из той же таблицы, что и предыдущие два фрагмента кода.
[jscript]function collectFiles() <
currentSheet = SpreadsheetApp.getActiveSheet();
countDoc = 2; // Укажите здесь число респондентов в таблице
finalText=»»;
endDoc = DocumentApp.create(‘Все отзывы’);
for (i=1;i doc = DocumentApp.openById(docID);
text = doc.getBody().getText();
body = endDoc.getBody();
// Вставляем в файл «Все отзывы» текст с отзывом респондента
body.appendParagraph(currentSheet.getRange(‘A’+i).getValue() +» – » +text);
>
>[/jscript]

Автоматическое форматирование

Теперь немного оживим внешний вид нашего текста. Нечетные абзацы сделаем черным шрифтом на красном фоне, а четные жирным красным шрифтом без фона. Для этого нам надо создать два массива с параметрами стилей, перебрать абзацы один за другим, проверить их на четность/нечетность и применить к каждому соответствующий набор стилей.

[jscript]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; i4 лайфхака Gmail и Google Apps ScriptАвтоматизируем Google Таблицы на Google Apps ScriptПланируем жизнь с Google Calendar и Google Apps ScriptПростые автоматизации для Google Drive

(4.00 из 5, оценили: 1)

Google Apps Script с чего начать изучение?

Доброго времени суток.
Подскажите пожалуйста материалы (видео и текстовые) с которых можно начать изучение JavaScript чтобы в дальнейшем применять его в разработке аддонов в Google Apps Script. (большинство материалов которые я нахожу ориентированы либо на разработку сайта либо на работы в node.js)

В идеале материалы в которых подробно разобрано большое количество кейсов (50-60% практики к теории)

Возможно существуют русскоязычные обучающие материалы непосредственно по Google Apps Script?
Приветствуются ссылки на примеры реализации типичных кейсов с помощью Google Apps Script.

Уровень знаний JavaScript средний/ниже среднего (нет практики разработки на js, только как хобби)

Пользовательские функции в Google Таблицах

Google Таблицы предлагают сотни встроенных функций, таких как СРЗНАЧ (AVERAGE), СУММ (SUM) и ВПР (VLOOKUP). Когда их недостаточно для ваших нужд, вы можете использовать Google Apps Script, чтобы написать собственную функцию, например, конвертирование метров в мили или получение данных непосредственно из Интернета, и использовать ее как обычную встроенную функцию.

Начало

Пользовательские функции создаются с использованием стандартного JavaScript.

Ниже приведена простая пользовательская функция DOUBLE , которая множает входящее значение на 2:

Если вы не знаете, как использовать JavaScript, или у вас нет времени для изучения, посмотрите дополнения к Таблицам, возможно, там уже есть нужная вам функция.

Создание пользовательской функции

Чтобы написать пользовательскую функцию:

  1. Создайте или откройте Google Таблицу.
  2. Выберите в главном меню Инструменты > Редактор скриптов. Если вы видите экран приветствия, то выберите «Пустой проект».
  3. Удалите весь код из редактора. Для функции DOUBLE , описанной выше, просто скопируйте его и вставьте в редактор.
  4. Выберите главное меню Файл > Сохранить. Задайте имя проекта и нажмите Готово.


Это все! Теперь вы можете использовать свою пользовательскую функцию.

Получение пользовательской функции из хранилища дополнений

Хранилище дополнений предлагает несколько пользовательских функций в виде дополнений к Google Таблицам. Чтобы использовать или найти дополнение:

  1. Создайте или откройте Google Таблицу.
  2. Выберите главное меню Дополнения > Установить дополнения.
  3. Откроется окно хранилища дополнений. В поле поиска введите «custom function» и нажмите ввод.
  4. Если вы нашли интересующее вас приложение, нажмите на кнопку «+БЕСПЛАТНО» для установки.
  5. Диалоговое окно может сообщить вам, что дополнение требует авторизации. Если это так, внимательно прочитайте сообщение и нажмите «Разрешить». После этого будет установлено дополнение.
  6. Дополнение установлено. Для использования его в других Таблицах откройте любую из них и выберите в главном меню Дополнения > [имя дополнения] > Используйте его в текущей Таблице.

Использование пользовательской функции

После написания пользовательской функции или установки из хранилища дополнений ее легко использовать как обычную встроенную функцию:

  1. Нажмите на ячейку, которую собираетесь использовать для функции.
  2. Введите знак равенства ( = ), за которым следует имя функции с каким-либо параметром. Например, =DOUBLE(A1) . Далее нажмите ввод.
  3. Ячейка какое-то мгновение будет отбражать «Loading. «, а после этого выведет результат. The cell will momentarily display Loading. then return the result.

Руководство по пользовательским функицям

Прежде чем создавать собственные функции, ознакомьтесь с инструкцией ниже.

Выбор имени

В дополенние к стантартным соглашениям о выборе имени JavaScript функции, обратите внимание на следующее:

  • Имя пользовательской функции должно отличаться от имен встроенных функций, таких как SUM () .
  • Имя функции не может заканчиваться символом подчеркивания _ , который обозначает закрытую функцию в Apps Script.
  • Имя должно быть объявлено в синтаксисе функции function myFunction() , а не в выражении var myFunction = new Function() .
  • Использование прописных букв не имеет значения, в то время как в Таблицах функции традиционно используют написание все с заглавных.
Цукерберг рекомендует:  Множественное слайдшоу

Аргументы

Как и встроенные функции, пользовательские могут принимать аргументы в виде входящих значений:

  • Если вы обратитесь к функции с сылкой на одну ячейку в аргументе (как =DOUBLE(A1) ), аргумент будет содержать значение этой ячейки.
  • Если вы вызовете функцию с сылкой на диапазон ячеек в аргументе (как =DOUBLE(A1:B10) ), то аргумент будет содержать двумерный массив значений этих ячеек. Например, на изображении ниже аргумент в =DOUBLE(A1:B2) интерпретируется как double([[1,3],[2,4]]) . Обратите внимание, что пример DOUBLE , который приведен выше, должен быть изменен для работы с массивом.
  • Аргументы должны быть детерминированными. То есть, встроенные функции, который каждый раз возвращают разный результат — такие как NOW() или RAND() — не разрешено использовать в качестве аргументов пользовательских функций. Если пользовательская функция пытается вернуть значение, основанное на одной из этих непостоянных встроенных функций, она будет отображать Loading . до бесконечности.

Возвращаемые значения

Каждая пользовательская функция должна возвращать значение для отображения:

  • Если функция возвращает одно значение, то оно отображается в ячейке, в которой была вызвана функция.
  • Если пользовательская функция возвращает двумерный массив значений, значения будут заполнять соседние клетки вправо и вниз до тех пор, как эти клетки остаются пустыми. Если же заполнение приведет к перезаписи существующих значений в соседних ячейках, пользовательская функция выдаст ошибку. Для примера, смотрите раздел по оптимизации пользовательских функций.
  • Пользовательская функция не может повлиять на другие, чем на те, в которые она возвращает значение, ячейки. Другими словами, пользовательская функция не может редактировать произвольные диапазоны, а только те, из которых она вызывается и соседние. Чтобы редактировать произвольные ячееки, рекомендуется использовать пользовательское меню для запуска функции.
  • Вызов пользовательской функции должн вернуть значение в течение 30 секунд. Если этого не произошло, то ячейка будет отображать сообщение об ошибке: «Внутренняя ошибка при выполнении пользовательской функции».

Типы данных

Google Таблица хранит данные в различных форматах, в зависимости от характера данных. Когда эти значения используются в пользовательских функциях, Apps Script обрабатывает их как соответствующий тип данных в JavaScript. Это наиболее распространенная путаница:

  • Времена и даты в Таблицах становится объектом Date в Apps Script. Если Таблица и сценарий используют различные часовые пояса (редкая проблема), пользовательская функция должна самостоятельно это компенсировать.
  • Значения Длительность в Таблицах также становятся объектами Date, но работа с ними может быть сложной.
  • Значения в процентах в Таблице становятся десятичными числами в Apps Script. Например, ячейка со значением 10% будет в Apps Script 0,1 .

Автозавершение

Google Таблицы поддерживают автозавершение, так же как и встроенные функции. При вводе имени функции в ячейке, вы увидите список встроенных и пользовательских функций, соответствующий тому, что вы вводите. Пользовательские функции будут появляться в этом списке, если их сценарий включает в себя JSDoc-тег @customfunction , как в DOUBLE() приведенном ниже.

Дополнительно

Использование Apps Script сервисов


Пользовательские функции могут вызывать определенные сервисы Apps Script для выполнения более сложных задач. Например, пользовательская функция может вызвать службу Language, чтобы перевести английскую фразу на испанский язык.

В отличие от большинства других типов приложений скриптов, пользовательские функции никогда не спрашивают пользователей об авторизации доступа к персональным данным. Следовательно, они могут вызвать только те сервисы, которые не имеют доступа к персональным данным, в частности, следующее:

Supported services Notes
Cache Работает, но не особенно полезно в пользовательских функциях
HTML Может генерировать HTML, но не может отобразить его (используется редко)
JDBC
Language
Lock Работает, но не особенно полезно в пользовательских функциях
Maps Можно рассчитать направления, но не отображать карты
Properties
Spreadsheet Только для чтения (можно использовать большинство get\*() методов, но не set\*() .
Нельзя открыть другие Таблицы ( SpreadsheetApp.openById() или SpreadsheetApp.openByUrl() )
URL Fetch
Utilities
XML .

Если ваша пользовательская функция выбрасывает сообщение об ошибке «У вас нет разрешения на вызов X службы.» , значит служба требует авторизации пользователя и, таким образом, не может быть использована.

Чтобы воспользоваться службой, кроме тех, которые перечислены выше, необходимо создать пользовательское меню, которое запускает функцию сценария вместо написания пользовательской функции. Функция, которая вызывается из меню предложит пользователю авторизацию в случае необходимости и, следовательно, может использовать все сервисы Apps Script.

Общий доступ

Пользовательские функции привязаны к Таблице, в которой они созданы. Это означает, что пользовательская функция написаная в одной таблице не может быть использована в других, если не используется один из следующих способов:

  • Выберите в меню Инструменты > Редактор сценариев, чтобы открыть редактор сценариев, а затем скопировать текст сценария из исходной Таблицы и вставить его в редактор сценариев другой Таблицы.
  • Сделайте копию Таблицы, которая содержит пользовательскую функцию, выбрав в меню Файл > Создать копию. Когда Таблица копируется, любые скрипты, прикрепленные к ней копируются также. Любой, кто имеет доступ к Таблице может скопировать сценарий. (Соавторы, которые имеют доступ только на просмотр не могут открыть редактор скриптов в исходной Таблице. Тем не менее, когда они делают копию, они становятся владельцем копии и могут видеть скрипт).
  • Опубликуйте скрипт как дополнение к Google Таблицам.

Оптимизация

Каждый раз, когда пользовательская функция используется в Google Таблице, она делает отдельный вызов к серверу Apps Script. Если ваша таблица содержит десятки (или сотни, тысячи!) пользовательских вызовов, этот процесс может быть довольно медленным.

Следовательно, если вы планируете использовать пользовательскую функцию несколько раз на большом диапазоне данных, рассмотрите вопрос об изменении ее таким образом, что она принимает диапазон в качестве входных данных в виде двумерного массива, а затем возвращала двумерный массив, который сможет перезаполнить соответствующие ячейки.

Например, функция DOUBLE() показаная выше, может быть переписана, чтобы принимать одну ячейку или диапазон ячеек следующим образом:

Описанный выше подход использует метод map объекта Array из JavaScript, чтобы рекурсивно вызвать DOUBLE() для каждого значения в двумерном массиве ячеек. Она возвращает двумерный массив, содержащий результаты. Таким образом, вы можете вызвать DOUBLE только один раз, но вычислить его для большого числа клеток сразу же, как показано на рисунке ниже. (Вы можете сделать то же самое с вложенными if вместо вызова map ).

Аналогичным образом, пользовательская функция ниже эффективно извлекает содержимого из Интернета и использует двумерный массив для отображения двух столбцов результатов с помощью всего одного вызова. Если каждая ячейка требует свой собственный вызов функции, операция займет значительно больше времени, так как сервер Apps Script будет загружать и разбирать XML каждый раз.

Эти методы могут быть применены к почти любой пользовательской функции, которая используется повторно в Таблице, хотя детали реализации могут меняться в зависимости от условий.

Google Apps Script: полезные функции и фишки для SEO (часть первая)

Всем привет. Я SEO-специалист Netpeak в отделе по работе с крупными проектами. Масштабные проекты — это всегда большие объемы данных, много анализа и исследований, которые отнимают много времени, поэтому без автоматизации тут не обойтись. Вообще в работе очень сильно помогает софт ребят из Netpeak Software , за это им отдельное большое спасибо.

В этой рубрике (если зайдет, конечно), я буду демонстрировать свои небольшие скрипты, полезные функции и фишки Google Apps Script. В конце каждого поста будет бонус — небольшой скрипт.

Так как это первый пост, думаю, нужно написать о языке и ограничениях.

Скрипт работает в сервисах:

  1. Google Docs.
  2. Google Sheets.
  3. Google Slides.
  4. Google Forms.

Какой уровень владения языками программирования должен быть, чтобы понимать и самостоятельно писать скрипт? Ответ простой: любой, главное желание, терпение и смекалка =)

Я буду приводить примеры скриптов с подробными комментариями, чтобы было понятно.

Сразу скажу: я не программист и отдельно какие-то курсы не проходил. Возможно, где-то в коде откровенные «велосипеды». Буду рад, если в комментариях вы мне укажете на них.

Как создать скрипт Google Apps Script для Google Sheets

По традиции, выводим надпись «Hello world»:

1. Заходим в таблицу.

2. Переходим во вкладку «Инструменты» — «Редактор скриптов».

3. Мы видим рабочую область, где и нужно писать скрипты.


4. Вставляем код:

5. Запускаем нашу функцию:

6. Сохраняем проект и проходим этап авторизации.

Шаг 1:

Шаг 2:

Шаг 3:

Шаг 4:

Шаг 5:

Разбор кода скрипта в Google Apps Script

В этой строке мы создаем объект класса SpreadsheetApp, чтобы в дальнейшем мы могли использовать различные методы этого класса.

В этой строке грубо говоря мы присваиваем переменной sheetOne так называемый адрес вкладки, которая называется Пост 1. Это упрощает работу с таблицами.

В этой строке мы выводим надпись «Hello world» в ячейку A1 на вкладке «Пост 1». Тут нужно разобраться подробно:

    1. sheetOne — как мы описали выше, это «ссылка» на нашу вкладку «Пост 1».
    2. .getRange(1,1) — это метод, который указывает, что мы будем работать с ячейкой, которая имеет адрес: колонка 1 (A) и столбец 1.
    3. .setValue(«Hello world») — это метод, который записывает то, что в скобках. В нашем случае это «Hello world».
  • Структура самой функции:

Бонус: как спарсить тег Title и метатег Description

Скрипт можно получить по ссылке. Обязательно делаем копию.

1. В колонке А Вставляем наши URL.

2. Запускаем скрипт.

3. Забираем результаты.

Какие сайты скрипт не сможет спарсить:

  • Если кодировка сайта не “utf-8” или “windows-1251”.
  • Нерабочие сайты.
  • Не забываем об ограничениях.
  • Сайты с нестандартной структурой.

  • Вывод

    Google Apps Script помогает бесплатно автоматизировать много ручной работы, например:

    1. Автоматически выгружать различные показатели в Google Analytics и настроить оповещение через электронную почту, если данный показатель изменился на какой-то процент.
    2. Выгружать данные по количеству кликов и показов из сервиса Google Search Console и также оповещать об изменениях.
    3. Мониторить изменения на сайте (наличие новых страниц, изменения в метатегах, коды ответа сервера и так далее).

    Конечно, в скриптовом языке Google Apps Script есть много других полезных проверок и расчетов. Их я продемонстрирую в следующих статьях.

    Если хотите поделиться своими фишками или задать вопросы, велкам в комментарии.

    Targetprocess

    The Targetprocess Developer Hub

    Welcome to the Targetprocess developer hub. Here you’ll find comprehensive guides and documentation to help you start working with Targetprocess as quickly as possible and support you if you get stuck. Let’s jump right in!

    Search results for «<< search.query >>«

    Google Apps Script

    Samples of usage of Targetprocess REST API in Google Apps Script code

    Google Apps Script is a JavaScript cloud scripting language that provides easy ways to automate tasks across Google products and third party services and build web applications.

    Using built-in Targetprocess REST API it is possible to fetch data from your Targetprocess account to Google Spreadsheets document. Update action is also supported and described below.

    Open your Google spreadsheet.

    Press Tools > Script editor…

    Rename the newly created project.

    Copy the source code to the editor area for Code.gs file. Use Fetch data from Targetprocess example from the article below.

    Replace hostname and authentication token values with the ones specific to your own customer account with Targetprocess.

    For isTokenSetFromUserProfileTab parameter, use one of the two options. Use true if your token is issued from User Profile > Access Tokens tab in Targetprocess. Use false when the token is issued from /api/v1/authentication REST API endpoint.

    Select the function named fetchTargetprocessData in the dropdown for execution.

    Grant this script with requested permissions. This action must be done only once.

    Success! Your spreadsheet is now filled in with Targetprocess entities.

    This script connects to Targetprocess account myaccount.tpondemand.com using token-based authentication and queries list of User Stories. Details of the loaded stories are appended to the initially cleared Google Spreadsheet.

    This script connects to Targetprocess account myaccount.tpondemand.com using token-based authentication and creates new User Story entity in Project #2. Numeric ID, Name, Description and creation timestamp of the user story are appended to the initially cleared Google Spreadsheet.

    In the demo sample we retrieve first 10 matching user stories. Number of entities we query is encoded in the script header:

    It is possible to increate takeCount parameter up to 1000.

    If you have more than 1000 entities that match your query, you have to create a script that makes multiple API calls using paging parameters and then merges retrieved data.

    It is also possible to include more advanced REST API techniques (such as filtering, appended fields and collections) when integrating with Excel. For more information on filters please refer to Targetprocess REST API filters description.

    Here are examples of how the source code may be modified to support filters.


    Нужна помощь google таблицы и google app script

    Добрый день Пикабушники. Постоянно пользуюсь гугл документам, но на днях потребовалось добавить некий скрипт в гугл таблицы. Суть скрипта следующая:

    пользователь нажимает на кнопку «Продажа», затем открывается диалоговое окно в котором пользователь вводит код проданного товара»в моем случае считывает сканером штрих кодов». И теперь самое главное — если значение в текстовом поле диалогового окна соответствует одному из нужных значений, то диалог закрывается а в нужную ячейку добавляется +1.

    Процесс появления диалогового окна и добавления +1 в нужное место работает, но только после нажатия кнопки «ОК». А нужно что бы содержимое строки постоянно проверялось, и в случае если оно соответствует нужному значению, диалог закрывался автоматически без нажатия кнопки «ОК».

    Чувствую что осталась какая то мелочь, но сам сделать не могу, и в интернете не нахожу.

    Как писать скрипты, макросы и код в Google Scripts — часть 1

    Доброго времени суток, дорогие читатели!

    Как некоторые могут помнить, у нас была одна статья на тему программирования в Google таблицах. Она была больше как эксперимент, который показал, что в общем-то это направление довольно популярно (да-да, про эксель я не забыл, он тоже будет. рано или поздно, но будет).

    Я не стал включать ту статью в этот, пока еще начинающийся, цикл, а решил начать его с самого нуля. Цель его довольно простая — показать, что всё не так уж и сложно, если знать некоторые особенности программирования в целом. Поэтому я постараюсь не столько расписать примеры, сколько объяснить как именно придти к такому решению.

    Тем, кто уже знаком с такими понятиями, как: функция, переменная, оператор, массив и тому подобное; будет (по всей видимости) скучновато, так что в таком случае рекомендую просмотреть статью по диагонали, вдруг что интересное для себя найдете.

    Итак, вы уже знаете где находится редактор скриптов (если кто забыл, смотрите предыдущую статью), открываете его и. идете заваривать чай (кофе, какао, глинтвейн), а я пока расскажу немножко теории ( которую заодно надо бы освежить в памяти ).

    С чего начинается любой скрипт? Очевидно, что с какого-то кода, но с какого? Вполне может так быть, что у вас уже появляются такие мысли при виде этого, а точнее того, белого экрана. Но это нормально. Когда мало опыта и много непонятного, хочется все бросить и лечь спать. Но не отчаивайтесь! И отойдите от кровати! Если я не буду писать это в некотором ироничном виде, то от моей заунывной статьи вы уже на третьей строчке усне..

    Пишем и используем Google Scripts: Line Zero, — Beginning

    Так вот, с чего нам начать? Я сейчас не имею в виду алгоритм действий, который вы держите в голове, или блок-схемы на листочке, нет. Нам следует начать с. объявления функции.

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

    Объявление функции имеет определенный формат вида:

    Где вместо FUNCTIONNAME вы можете ввести любое название, кроме уже зарезервированных системой гуглом, а в скобочках вы можете указать параметры, которые бы хотели передать в эту функцию.

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

    Итак, вы определились с вашей первой функцией, теперь что? А теперь нужно объявить переменные. Для вашей позиции в торговом автомате переменными могут быть: номер ряда, номер колонки, картинка позиции, её цена.

    Переменными в общем случае может быть любой набор символов любого типа. Объявляются они очень просто, достаточно сказать котелок вари

    И ой, она уже объявлена. А для чего это нужно?

    Когда компилятор (такая штука, которая превращает удобочитаемый код для нас в машинный набор нулей и единиц для компьютера) так вот, когда компилятор начинает последовательно читать ваш код (а делает это он либо при сохранении вами кода, либо при запуске) то встречая неизвестные ему названия он первым и последним делом ищет где вы объявили ему (рассказали что это такое и что с этим делать) эти названия.

    Грубо говоря, если вы напишете e = m * c ^2 без объявления переменных, то компилятор перед запуском кода выдаст ошибку о том, что он вообще не имеет ни малейшего понятия кто такие e , m, с и что им всем от него нужно. А вот если вы напишете:

    То он вам посчитает безо всякого труда, потому что он уже знает что e , m , c , — это числа, имеющие значения 0, 1, 2 соответственно.

    Однако, если вы напишете:

    То он вам, конечно, посчитает выражение e = m * c ^2 , но его ответом будет e = 2 , потому что у вас несогласованны типы ( m — это строка, c — это число) и он просто отбросит строки ( VBA , например, здесь выдаст ошибку что у вас неправильные типы данных).

    Если же вы объявите переменную, но не напишете чему она равна, то компилятор будет считать, что значение не определено ( undefined ).

    Что касается самих выражений, здесь не совсем обычная математика (а кто говорил, что будет легко?). Если там выражение e = m*c^2 будет эквивалентно выражению m*c^2 = e , то здесь не так. Здесь вообще оператор под названием «равно» выглядит иначе и обозначается как » == «. А то, что написано выше, это не «е равно эм * це квадрат», это читается как «е присвоить эм*це квадрат» и данный оператор называется оператором присваивания. Вот этот момент очень важен и здесь не следует путать.

    Давайте подробнее остановимся на операторах. Есть несколько категорий:

    • Арифметические. Для примера x = 5:
      Оператор Формула Значение x Значение y
      + y = x + 2 x = 5 y = 7
      y = x — 3 x = 5 y = 2
      * y= x * 7 x = 5 y = 35
      ^ y = x ^ 2 x = 5 y = 25
      % y = x % 3 x = 5 y = 2
      ++ y = ++x
      y = x++
      x = 6
      x = 6
      y = 6
      y = 5
      y = —x
      y = x—
      x = 4
      x = 4
      y = 4
      y = 5
    • Операторы присваивания — позволяют присвоить переменной какое-то значение. Возьмем x = 10 .
      Оператор Формула Аналогичная формула Результат Комментарий
      = x = 3 3 =3
      += x += 3 x = x + 3 13 Это не «икс равно икс плюс три». Это «икс присвоить икс плюс 3», т.е. добавить три к тому, что было икс.
      -= x -= 3 x = x — 3 7
      *= x *= 4 x = x * 4 40
      /= x /= 2 x = x / 2 5
      %/ x %= 3 x = x % 7 1
    • Строковые операторы — в общем-то они просто склеивают строки в бОльшие строки. Например у вас есть text1 = «Добрый «, text2 = «день».
      Оператор Формула Значение text1 Значение text2 Значение text3
      = text3 = text1 + text2 «Добрый « «день» «Добрый день»
      += text1 += text2 «Добрый день» «день»

    В чем же разница между первым и вторым оператором? (ответ в следующей строке, выделите мышкой)


    В первом случае у нас значение переменных text1 и text2 присваиваются переменной text3 , во втором же случае нам не нужна дополнительная переменная, мы просто обновляем значение переменной text1 .

    Операторы сравнения — применяются при сравнении одной переменной с другой или с каким-то условием. Например возьмем x = 5 (var x = 5):

    Оператор Описание Формула Значение Комментарий
    == Равно x == 7 false
    === Равно по значению и по типу x === 5

    x===»5″

    true

    false

    В первом случае мы сравниваем с типом «число»

    Во втором — со строкой (о чем говорят кавычки)

    != Не равно x != 7 true
    !== Не равно по значению или типу x!== 5

    x!==»5″

    false

    true

    false (по значению)+false (по типу) = false

    false+true = true (это дискретная логика, да)

    > Больше x > 5 false Пять больше пяти? Определенно, нет.
    = Больше или равно x >= 5 true Пять больше или равно пяти? Да, пять равно пяти
    x = 5, y = 3:

    Оператор Описание Пример Значение Комментарий
    && Логическое «И» (x > 3 && y 3 || y 1 (true) и 0 (false) . И с ней возможны три вида операций — логическое «И» ( & ), логическое «ИЛИ» ( + ) и логическое «Не» ( ! ). Выглядит это таким образом (для переменных X и Y ):
    X Y X&Y X+Y !X !Y !X&!Y !X+!Y
    1 1 1 1
    1 1 1 1
    1 1 1 1
    1 1 1 1

    Отсюда, кстати говоря, следуют занятные комбинации: !( X&Y) это тоже самое, что !X+!Y (не ( X И Y) = не X ИЛИ не Y ), а !( X+Y) это тоже самое, что !X&!Y (Можете открыть учебник по дискретной логике и убедиться, что это так).

    к содержанию ↑

    Пишем и используем Google Script: Line 1, — I Don’t get it

    Итак, в общем-то с основами разобрались. Теперь немного практики. Задача:

    У нас есть некоторый набор значений в ячейках (cкажем, три ряда по четыре колонки случайных чисел), нам надо отдельно вывести сумму каждого ряда и его среднее значение (учитывая что мы не знаем о встроенных функциях, а пишем сами).

    Таблица для нашего примера:

    A B C D
    1 2 3 4 1
    2 -4 12 3 5
    3 1 1 2 5

    Итак, с чего начать? Нет, не с написания кода, сначала надо прикинуть план действий (хотя бы очень грубо).

    1. Как посчитать сумму? Очевидно, сложить каждое значение в ряду. Окей, кажется несложным.
    2. Как получить среднее значение? Можно сложить каждое значение ряда и поделить на кол-во значений. Но зачем заново считать, если мы сумму уже посчитали на предыдущем шаге? Окей, тоже легко.
    3. Остался один вопрос, — как получить значение из ячейки и как его потом туда записать? А вот тут-то и начинаются сложности.

    Путем нехитрого гугления мы достаточно быстро выясним как вытащить значение ячейки из таблицы. Но какой смысл копировать код, ничего в нем не понимая? Правильно, никакого. С точки зрения.. ммм.. гугла таблица представляется собой объект (класс), состоящий из множества подклассов (типа матрешки). Иерархия там примерно такая:

    • SpreadsheetApp, — самый верхний уровень, указывает, что мы хотим работать с таблицами (создавать, удалять, изменять и вообще делать с ними все, что можно. По ссылке можно изучить все свойства и методы этого класса. Т.е. все, что с ним можно сделать);
    • Spreadsheet, — класс, который отвечает за действия с самим листом таблицы (копирование, переименование, защита, сокрытие, права доступа и тп);
    • Sheet, — класс, который отвечает за действия на каком-то листе таблицы ( добавление ряда, добавление графиков, определение размера таблицы и многие другие). Во многих случаях можно использовать его вместо класса Spreasheet ;
    • Range, — класс, который отвечает за действия с каким-то определенным диапазоном ячеек на листе (включая выбор диапазона).

    Таким образом, мы можем получить значение как одной ячейки, так и диапазона ячеек. Воспользуемся вторым вариантом. Для этого пишем соотв. код:

    Создаем нашу функцию:

    Почти всегда первая строчка функции начинается со ссылки на таблицу. И здесь мы ссылаемся именно на текущую таблицу (ведь мы можем ссылаться и на другой лист, на другой файл и тп.).

    Да, можно вставлять комментарии, которые компилятор будет игнорировать (и подсветит оранжевым). Для этого перед словом/фразой/строчкой достаточно добавить два слеша // и вся оставшаяся строка будет закомментирована. Если же надо закомментировать много строк, то лучше воспользоваться вторым вариантом — поставить в начале комментария символы /* , а в конце */ . Т.е. Комментарий целиком будет выглядеть примерно так:

    Теперь достанем наши значения из ячеек:

    При этом особенностью метода getValues является то, что на выходе мы получаем матрицу (двумерный массив или по простому — таблицу), где первый разряд означает ряды, второй — колонки. В нашем примере, например, элемент массива dataArray[0][1] будет означать. нет, не нулевой ряд, а первый ряд и вторая колонка (т.к. нумерация ячеек идет с единицы, а нумерация массивов всегда идет с нуля ).

    Теперь мы получили значения наших ячеек и можем с ними работать. Как мы будем суммировать? Самое простое — явно:


    Да, не очень красиво, но работает. Кстати проверить результат можно несколькими способами:

    1. Записать в журнал. Для этого добавить после var sum3 строчку Logger.log («\nСумма 1 ряда: «+sum1+»\nСумма 2 ряда: «+sum2+»\nСумма 3 ряда: «+sum3);
      Где \n — это распространенное обозначение перевода строки ( Enter ). После этого в том же редакторе скриптов переходим в пункт меню » Вид — Журналы «:
    2. Вывести оповещение в браузере: Browser.msgBox(«Суммы трех рядов: «+sum1+» «+sum2+» «+sum3);
      При выполнении скрипта перейдите на ваш лист и увидите всплывающее окно
    3. Поставить Breakpoint (1) напротив var sum3 , после чего нажать не на старт, а на иконку с жуком ( 2 , означает debug ). У вас напротив переменной sum3 (4) будет написано » undefined » (на скрине этот этап пропущен). Это потому, что скрипт сейчас остановился перед этой строкой и он еще не отработал её. Для того, чтобы он сделал следующее действие, нажмите на кнопку со стрелкой (3) и вуаля (4) , переменная посчитана (наиболее удобный способ отладки и поиска косяков). Но это сработает, если у вас в функции код на этой строке не заканчивается (я обычно добавляю функцию Logger.log и ставлю Breakpoint на ней:

    У кого не получилось, код целиком ниже:

    Итак, первый пункт выполнен. Теперь приступаем ко второму. Учитывая, что мы (теперь) знаем сумму ряда и знали с самого начала кол-во чисел в ряду, добавляем еще три переменные и проверяем (значком я обозначаю место, где можно поставить Breakpoint для быстрого просмотра результатов):

    Что ж. Пункт 2 выполнен. осталось это дело сохранить, например в ячейках E , F . Мы уже знаем как достать данные из ячеек, а вот как их туда поместить? В общем-то тут никакой магии и нет, раз есть функция get , то можно догадаться, что есть функция и set .

    При этом, мы должны указать данные точно в таком же формате, как мы их получили. Присваивание значений массивам в общем-то достаточно простая задача. Допустим у нас есть значения 1, 2, 3, 4, 5 и нам нужен массив. Объявляем:

    Однако это массив с одним разрядом (одномерный), нам же нужен двумерный, как сделать его? Для этого используется конструкция вида [[]] , как ниже:

    Выглядит криповато, но массив можно записать еще таким образом:

    А это уже другое дело! Хотя тем, кто на этих массивах уже не первую собаку съел, первый способ может быть удобней, т.к. быстрее.

    Теперь же осталось дело за малым. Записать сумму и среднее для каждого ряда:

    Запускаем и смотрим что у нас происходит на листе:

    Послесловие

    Итак, дабы не перегружать вас (дорогих читателей) информацией, первая часть на этом радостном событии завершена. Небольшой итог:

    Теперь вы имеете представление что такое функция, переменная, зачем они нужны, какие операторы бывают и что делают, а также усвоили (я надеюсь) базовые навыки по работе с таблицами.

    В следующей серии поговорим о том, как можно улучшить код, дабы не плодить кучу переменных и иметь возможность работать с таблицей значений переменной длинны (т.е. когда мы заранее не знаем сколько рядов и строк нам надо). А также немножко разобьем все это дело на несколько функций. Stay Tunned!

    Печать на консоль в Google Apps Script?

    Я очень новичок в программировании (взял некоторые курсы JS на Codecademy). Я пытаюсь создать простой скрипт, чтобы определить, если получить таблицу с результатами из игры в покер, кто должен заплатить кому. Я открыл скрипт Google Apps и написал для начала:

    Идея состоит в том, чтобы создать массив с общим количеством игроков в нем. При запуске кода я думал, что он напечатает «3» на консоли. Но ничего не случилось. Он сказал

    «ReferenceError:» console «не определен.»

    A) Что я не понимаю о том, как работает консоль Google Apps Script в отношении печати, чтобы я мог убедиться, что мой код выполняет то, что мне нужно?

    B) Это проблема с кодом?

    Консоль недоступна, поскольку код работает в облаке, а не в вашем браузере. Вместо этого используйте класс Logger, предоставляемый GAS:

    а затем просмотрите результаты в среде IDE в разделе «Просмотр» > «Журналы».

    Вот некоторая документация по протоколированию с GAS.

    Изменить: 2020-07-20 Приложения script теперь также предоставляют Stackdriver Logging. Просмотрите эти журналы в редакторе script в разделе «Просмотр — Консольные журналы».

    Просто для того, чтобы опираться на хакерское решение vinnief выше, я использую MsgBox следующим образом:

    и он действует как точка прерывания, останавливает script и выводит любую строку, которая вам нужна для всплывающего окна. Особенно я нахожусь в Листах, где у меня проблемы с Logger.log, это обеспечивает адекватное обходное решение в большинстве случаев.

    Несмотря на то, что Logger.log() является технически правильным способом вывода чего-либо на консоль, у него есть несколько неприятностей:

    1. Выход может быть неструктурированным беспорядком и трудно усваивается.
    2. Сначала вы должны запустить сценарий, затем нажмите «Просмотр/Журналы», который представляет собой два дополнительных клика (один, если вы помните сочетание клавиш Ctrl + Enter).
    3. Вы должны вставить Logger.log(playerArray) , а затем после отладки вы, вероятно, захотите удалить Logger.log(playerArray) , следовательно, еще 1-2 шага.
    4. Вы должны нажать OK, чтобы закрыть оверлей (еще один дополнительный клик).

    Вместо этого, когда я хочу отлаживать что-то, я добавляю точки останова (нажмите номер строки) и нажмите кнопку «Отладка» (значок ошибки). Точки останова работают хорошо, когда вы присваиваете что-то переменной, но не так хорошо, когда вы инициируете переменную и хотите заглянуть внутрь нее в более позднюю точку, что похоже на то, что пытается выполнить op. В этом случае я бы заставил условие break, введя «x» (x отмечает пятно!), Чтобы выбросить ошибку во время выполнения:

    Сравнить с просмотром Журналы:

    Консоль Debug содержит больше информации и ее намного легче читать, чем наложение журналов. Одним из незначительных преимуществ этого метода является то, что вам никогда не придется беспокоиться о загрязнении вашего кода с помощью команды ведения журнала, если сохранить чистый код — это ваша вещь. Даже если вы введете «x», вы вынуждены не забывать удалить его как часть процесса отладки, иначе код не будет работать (встроенный метод очистки, yay).

    Цукерберг рекомендует:  Топ-18 UX-дизайнеров в Instagram 2020
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих