# Google Sheets Balance v0.1

By [Karl](https://paragraph.com/@ifomoeverytime) · 2022-12-06

---

### Для чего?

Если у вас более 20,30,50,100 адресов(вы мультовод), то уверен сталкивались с ситуацией когда на одном или нескольких “забывали” средства. Данный скрипт поможет мониторить их балансы.

### Чем лучше аналогов?

Мы будем использовать App Scripts и потому лимиты внешних запросов в обычных запросах гугл-таблиц(50 в час) нам не будут доставлять неудобств. Мы сможем получать балансы для любого количества кошельков, неограниченное количество раз.

### Что понадобится?

Один гугл-аккаунт.

### Как установить/начать?

*   Открываем Google sheets(клик на ссылку ниже) и создаем новую таблицу.
    
    [https://docs.google.com/spreadsheets/](https://docs.google.com/spreadsheets/)
    
*   Заполняем в таблицу адреса как показано на рисунке ниже, вместо адресов из примера, вставляем адреса балансы которых мы хотим отслеживать, первую строку пропускаем.
    

![Пример заполнения таблицы адресов](https://storage.googleapis.com/papyrus_images/d84c347cdab823b5ec186ba3b159e2e6c6a6444347b6e3ffd5e78ff4861a0fea.png)

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

*   Теперь нам нужно добавить скрипт для подсчета. Для этого переходим в редактор скриптов с помощью меню Расширения → App Scripts.
    

![Переходим сюда](https://storage.googleapis.com/papyrus_images/2f126009358027c0b5613dae4974a13ed5c9d07c1e44c1d2383c553801bcd17a.png)

Переходим сюда

*   В новой вкладке у нас откроется редактор скриптов.
    

![Вкладка которую мы должны увидеть](https://storage.googleapis.com/papyrus_images/718d6f2a1221d5572493d57ea4eb610b77ee4e622fab2ab828e864b0e2d5474a.png)

Вкладка которую мы должны увидеть

*   Удаляем все из него и вставляем код из блока ниже\*(обновлено 2023-03-12, изменение верстки mainnet)\*.
    
        function getBalances()
        {
          var networks = [
            { name : 'ETH', url : 'https://etherscan.io/address/', sum: 0 },
            { name : 'Arbitrum', url : 'https://arbiscan.io/address/', sum: 0 },
            { name : 'Matic', url : 'https://polygonscan.com/address/', sum: 0 },
            { name : 'Optimism', url : 'https://optimistic.etherscan.io/address/', sum: 0 },
            { name : 'Bsc', url : 'https://bscscan.com/address/', sum: 0 },
            { name : 'Avax', url : 'https://snowtrace.io/address/', sum: 0 },
          ];
        
          var sheet = SpreadsheetApp.getActiveSheet();
          var cells = sheet.getDataRange().getValues();
        
          var walletsCount = 0;
          var balance = 0;
        
          for (var nI = 0; nI < networks.length; nI++) {
            sheet.getRange(1, nI + 2).setValue(networks[nI].name);
          }
        
          for (var i = 1; i < cells.length; i++) {
            if (cells[i][0] !== '') {
              walletsCount++;
              for (var nI = 0; nI < networks.length; nI++) {
                if (networks[nI].name == 'ETH') {
                  balance = fetchUSDBalanceMainNet(UrlFetchApp.fetch(networks[nI].url + cells[i][0], {muteHttpExceptions: true}).getContentText());
                } else {
                  balance = fetchUSDBalance(UrlFetchApp.fetch(networks[nI].url + cells[i][0], {muteHttpExceptions: true}).getContentText());
                }
                networks[nI].sum += balance;
                sheet.getRange(i+1, nI + 2).setValue(balance);
              }
            }
          }
        
          for (var nI = 0; nI < networks.length; nI++) {
            sheet.getRange(walletsCount+2, nI + 2).setValue(networks[nI].sum);
          }
        }
        
        function fetchUSDBalanceMainNet(html)
        {
          var output = html.match(new RegExp("<\/h4>(.*?)<span", 'si'));
          if (output !== null) {
            return parseFloat(output[1].match(new RegExp("\\$(.*)"), 'si')[1].replace(/,/g, ''));
          } else {
            return 0;
          }
        }
        
        function fetchUSDBalance(html)
        {
          var output = html.match(new RegExp("Value:<\/div>(.*?)<\/div>", 'si'));
          if (output !== null) {
            return parseFloat(output[1].match(new RegExp("\\$(.*)"), 'si')[1].replace(/,/g, ''));
          } else {
            return 0;
          }
        }
        
    
*   Жмем на иконку “Сохранить” и возвращаемся на вкладку с гугл таблицей.
    

![Жмем на эту кнопку](https://storage.googleapis.com/papyrus_images/c5bd11392f26c9bc13389563e545148e1737c463554f180aa947312a8223d587.png)

Жмем на эту кнопку

*   Далее мы создадим кнопку для обновления таблицы, для этого выделяем любую свободную ячейку правее колонки G(скажем I2) и переходим в меню Вставка → Рисунок.
    

![Переходим сюда](https://storage.googleapis.com/papyrus_images/1125c583d33d169d69d8e370360365829ab36df8cf21361a4fc592f843f338f1.png)

Переходим сюда

*   У нас откроется попап в нем в меню выбираем Фигуры → Прямоугольник(хотя это не принципиально, вы можете сделать круглую кнопку).
    

![Выбираем фигуру.](https://storage.googleapis.com/papyrus_images/4010d8dd8073e8f33ec0b6301d64c5dc1e6d6a086a078e17305d3d9a07b0e965.png)

Выбираем фигуру.

*   Рисуем кнопку(у нас изменится курсор после нажатия), кликаем внутри фигуры и вводим название, форматируем его по своему усмотрению.
    

![Рисуем кнопку](https://storage.googleapis.com/papyrus_images/ad42732e3adfd56df6413cc9999b1d18423eb609e4c46cc40c151464b17c53e4.png)

Рисуем кнопку

*   Жмем “Сохранить и закрыть”. Теперь у нас появилась кнопка, осталось добавить к ней функционал. Для этого нажимаем на ней правой кнопкой мышки(она выделится). В правом верхнем углу кнопки нажимаем на 3 вертикальных точки и в появившемся меню выбираем “Назначить скрипт”.
    

![Выбираем этот пункт меню](https://storage.googleapis.com/papyrus_images/f1dd520a6e628a043bc7c393819af32fff984013524a6418b26b1d2d1d10629c.png)

Выбираем этот пункт меню

*   В появившемся попапе вводим getBalances и нажимаем Ок.
    

![Назначаем скрипт на кнопку](https://storage.googleapis.com/papyrus_images/034ae4be9ba72ae7503c9247adbcbc97006df5e42630799e98b8973cf7b9da6b.png)

Назначаем скрипт на кнопку

*   Теперь проверим что у нас получилось. Жмем на созданную нами кнопку. В верхней части экрана появится сообщение что скрипт выполняется и через некоторое время(зависит от количества адресов), мы увидим результат.
    

![Результат](https://storage.googleapis.com/papyrus_images/46f00881750c865e3db319461b13d4e2d239b5d6a2f76b76cf118c7e09fe8cff.png)

Результат

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

### Что дальше?

Если скрипт окажется полезен. Добавлю подсчет балансов по токенам, сейчас идет подсчет баланса только основной монеты сети. Пожелания или идеи - велком сюда:

[https://t.me/IFOMOEverytime](https://t.me/IFOMOEverytime)

---

*Originally published on [Karl](https://paragraph.com/@ifomoeverytime/google-sheets-balance-v0-1)*
