Як писати скрипти, макроси і код в google scripts - частина 1 - замітки а
Доброго часу доби, дорогі Новомосковсктелі!
Я не став включати ту статтю в цей, поки ще починається, цикл, а вирішив почати його з самого нуля. Мета його досить проста - показати, що все не так вже й складно, якщо знати деякі особливості програмування в цілому. Тому я постараюся не стільки розписати приклади, скільки пояснити як саме прийти до такого рішення.

З чого починається будь-який скрипт? Очевидно, що з якогось коду, але з якого? Цілком може так бути, що у вас вже з'являються такі думки при вигляді цього, а точніше того, білого екрану. Але це нормально. Коли мало досвіду і багато незрозумілого, хочеться все кинути і лягти спати. Але не впадайте у відчай! І відійдіть від ліжка! Якщо я не буду писати це в деякому іронічному вигляді, то від моєї тужливої статті ви вже на третьому рядку уснея ..
Пишемо і використовуємо Google Scripts: Line Zero, - Beginning
Що ж це таке? Якщо говорити простою мовою, то функція - це одна з безлічі позицій в торговому (вендінговому) автоматі (ваш скрипт). Ви вибираєте позицію автомата (вказуєте функцію), згодовуєте йому гроші (параметри функції) і отримуєте якийсь предмет канцерогенної індустрії (якийсь результат). При цьому ви можете створити таких позицій (функцій) незліченна безліч.
Де замість FUNCTIONNAME ви можете ввести будь-яку назву, крім вже зарезервованих системою гуглом, а в дужках ви можете вказати параметри, які б хотіли передати в цю функцію.
Часто можна обійтися однією функцією, особливо, якщо у вас невелика завдання. Однак при досить великому шматку коду найкраще ділити функцію на кілька менших функцій, де одна викликається з іншого. Але про це в наступній серії.
Отже, ви визначилися з вашим першим функцією, тепер що? А тепер потрібно оголосити змінні. Для вашої позиції в торговому автоматі змінними можуть бути: номер ряду, номер колонки, картинка позиції, її ціна.
Змінними в загальному випадку може бути будь-який набір символів будь-якого типу. Оголошуються вони дуже просто, достатньо сказати казанок вари
І ой, вона вже оголошена. А для чого це потрібно?
То він вам вважатиме без жодних зусиль, тому що він вже знає що e. m. c. - це числа, які мають значення 0, 1, 2 відповідно.
Однак, якщо ви напишете:
То він вам, звичайно, вважатиме вираз e = m * c ^ 2. але його відповіддю буде e = 2. тому що у вас неузгоджені типи (m - це рядок, c - це число) і він просто відкине рядки (VBA. наприклад, тут видасть помилку що у вас неправильні типи даних).
Якщо ж ви оголосите змінну, але не напишете чому вона дорівнює, то компілятор буде вважати, що значення не визначене (undefined).
Що стосується самих виразів, тут не зовсім звичайна математика (а хто говорив, що буде легко?). Якщо там вираз e = m * c ^ 2 буде еквівалентно висловом m * c ^ 2 = e. Щось тут не так. Тут взагалі оператор під назвою "дорівнює" виглядає інакше і позначається як "==". А то, що написано вище, це не "е одно ем * це квадрат", це Новомосковскется як "е привласнити ем * це квадрат" і даний оператор називається оператором присвоювання. Ось цей момент дуже важливий і тут не слід плутати.
Отже, з чого почати? Ні, не з написання коду, спочатку треба прикинути план дій (хоча б дуже грубо).
- Як порахувати суму? Очевидно, скласти кожне значення в ряду. Окей, здається нескладним.
- Як отримати середнє значення? Можна скласти кожне значення ряду і поділити на кількість значень. Але навіщо заново вважати, якщо ми суму вже порахували на попередньому кроці? Окей, теж легко.
- Залишилося одне питання, - як отримати значення з комірки і як його потім туди записати? А ось тут-то і починаються складності.
Шляхом нехитрого гугленія ми досить швидко з'ясуємо як витягти значення осередки з таблиці. Але який сенс копіювати код, нічого в ньому не розуміючи? Правильно, ніякого. З точки зору. ммм. гугла таблиця представляється собою об'єкт (клас), що складається з безлічі підкласів (типу матрьошки). Ієрархія там приблизно така:
Таким чином, ми можемо отримати значення як одного осередку, так і діапазону комірок. Скористаємося другим варіантом. Для цього пишемо соотв. код:
Створюємо нашу функцію:
У більшості випадків перший рядок функції починається з посилання на таблицю. І тут ми посилаємося саме на поточну таблицю (адже ми можемо посилатися і на інший аркуш, на інший файл і тп.).
Тепер дістанемо наші значення з осередків:
При цьому особливістю методу getValues є те, що на виході ми отримуємо матрицю (двовимірний масив або по простому - таблицю), де перший розряд означає ряди, другий - колонки. У нашому прикладі, наприклад, елемент масиву dataArray [0] [1] буде означати. ні, не нульовий ряд, а перший ряд і друга колонка (тому що нумерація осередків йде з одиниці, а нумерація масивів завжди йде з нуля).
Тепер ми отримали значення наших осередків і можемо з ними працювати. Як ми будемо підсумовувати? Найпростіше - явно:
Так, не дуже красиво, але працює. До речі перевірити результат можна декількома способами:
У кого не вийшло, код цілком нижче:

Що ж. Пункт 2 виконаний. залишилося цю справу зберегти, наприклад в осередках E. F. Ми вже знаємо як дістати дані з комірок, а ось як їх туди помістити? В общем-то тут ніякої магії і немає, раз є функція get. то можна здогадатися, що є функція і set.
При цьому, ми повинні вказати дані точно в такому ж форматі, як ми їх отримали. Присвоєння значень масивів в общем-то досить просте завдання. Припустимо у нас є значення 1, 2, 3, 4, 5 і нам потрібен масив. оголошуємо:

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

Виглядає кріповато, але масив можна записати ще таким чином:
А це вже інша справа! Хоча тим, хто на цих масивах вже не першу собаку з'їв, перший спосіб може бути зручніше, тому що швидше.
Тепер же залишилася справа за малим. Записати суму і середнє для кожного ряду:
Запускаємо і дивимося що у нас відбувається на аркуші:

Післямова
Отже, щоб не перевантажувати вас (дорогих Новомосковсктелей) інформацією, перша частина на цю радісну подію завершена. Невеликий підсумок:
Тепер ви маєте уявлення що таке функція, змінна, навіщо вони потрібні, які оператори бувають і що роблять, а також засвоїли (я сподіваюся) базові навички по роботі з таблицями.
У наступній серії поговоримо про те, як можна поліпшити код, щоб не плодити купу змінних і мати можливість працювати з таблицею значень змінної довжини (тобто коли ми заздалегідь не знаємо скільки рядів і рядків нам треба). А також трошки розіб'ємо все це справа на кілька функцій. Stay Tunned!
P.S. За існування оной статті окреме спасибі одному проекту і члену нашої команди під ніком "barn4k".
P.S.2: Частина 2 живе за цим посиланням.
Я намагався не перевантажувати інформацією статтю, тому не торкався методи і властивості об'єктів (класів). Я про це буду в наступній статті говорити :)
Якщо коротко, то кожен об'єкт (Sheet, Range, SpreadsheetApp і тп) мають набір властивостей і методів, вони як правило не повторюються і виконують якісь певні дії з об'єктом, або дозволяють отримати інформацію про об'єкт.
В даному випадку (sheet.getRange) - це означає, що у нас є об'єкт sheet, для якого ми виконує метод getRange, який, в свою чергу, означає що ми хочемо отримати якийсь діапазон комірок, щоб в подальшому з ним працювати ( цей метод повертає нам об'єкт Range).