• Как проверить пустую ячейку в Google Sheets?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Пробуйте как-то так:

    const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sss = ss.getActiveSheet();
      const sss_max_rows = ss.getMaxRows();
      const sss_frozen_rows = 2; // ss.getFrozenRows() + 1;
      const sss_values = sss.getRange(sss_frozen_rows, 1, sss_max_rows-sss_frozen_rows, 1);
    
      sss_values.some(function (item, i) {
        let name = item[0];
    
        // Остановить цикл как только встретим пустую ячейку
        if ( name == "" ) return true;
    
        // Тут ваш код ...
      });


    Обратите внимание что вы в цикле 1000 раз получаете данные из таблицы, это плохо для скорости работы скрипта.
    Лучше один раз взять данные и потом пройтись по массиву.

    ---
    stomaks.me
    g-apps-script.com
    Ответ написан
    Комментировать
  • Как в Google Script создать функцию с определением, есть ли в ячейке ссылка?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Вот код пользовательской функции:

    Тут пример работы:
    База формул для google таблицы

    /**
     * @OnlyCurrentDoc
     *   EN: Restricts script access to the current sheet only.
     *   RU: Ограничивает доступ скрипта только к текущей таблице.
     */
    
    /* exported hasLink */
    /* globals sorosWrapper_ */
    
    /**
     * : Checks if the range contains links.
     * 
     * : Проверяет есть ли в диапазоне ссылки.
     * 
     * : 1.0
     * 
     * : Stoyanov Maksim (stomaks)
     * : stomaks.me
     * : G-Apps-Script.COM
     * 
     * @param {[cell_address]} cell_address
     *   : Cell address.
     * 
     *   : Адрес ячейки.
     *
     * @return
     *   : true - if there are links in the range, false - if not.
     * 
     *   : true - если в диапазоне есть ссылки, false - если нет.
     * 
     * @customfunction
     */
    function hasLink ( cell_address ) {
      const sheet = SpreadsheetApp.getActiveSheet();
      
      const formula = sheet.getActiveRange().getFormula();
      const args = formula.match(/hasLink\(([^\)]*?)\)/i)[1].trim();
      range = sheet.getRange(args);
      
      const values = range.getRichTextValues();
      
      const result = [];
      
      for ( let cells of values ) {
        for ( let cell of cells ) {
          const link_url = cell.getLinkUrl();
          if (link_url) result.push(link_url);
        }
      }
      
      return result.length ? true : false;
    }


    ---
    stomaks.me
    google-script.blog
    Ответ написан
    Комментировать
  • Как вызвать функцию в сайдбаре?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Вызвать функцию сервера google apps script?

    Тут описано как:
    https://developers.google.com/apps-script/guides/h...

    function doGet() {
      return HtmlService.createHtmlOutputFromFile('Index');
    }
    
    function doSomething() {
      Logger.log('I was called!');
    }


    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
        <script>
          google.script.run.doSomething();
        </script>
      </head>
      <body>
      </body>
    </html>


    Обратите внимание.
    google.script.run.doSomething(); - работает асинхронно.

    Ответ можно получить в withSuccessHandler(function)
    А ошибку в. withFailureHandler(function)

    google.script.run
    .withSuccessHandler(function ( response ) {
      console.info(response);
    })
    .withFailureHandler(function ( response ) {
      console.error(response);
    })
    .doSomething();


    Так не получится:
    let response = google.script.run.doSomething();

    Еще можно с помощью скриплетов:
    https://developers.google.com/apps-script/guides/h...

    ---
    https://g-apps-script.com
    Ответ написан
    Комментировать
  • Когда следует создавать функции?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Ну без кода говорить о какой либо оптимизации нет смысла.

    Общие принципы такие, старайтесь реже обращаться к документам и диску, если вы это делаете.

    Если вы работает с таблицей старайтесь реже перерисовывать интерфейс (spreadsheet.flush()).

    Опять же нужен ваш код чтобы понимать что вы делаете.
    Ответ написан
    1 комментарий
  • Как подсветить строку активной ячейки в Google sheet?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Можете попробовать такую функцию:
    Но она затирает фон ячеек и отрабатывает не моментально.

    function onSelectionChange ( e ) {
      let cache = CacheService.getDocumentCache();
      let range = e.range;
      
      let oldRow = cache.get("oldRow");
      if ( oldRow > 0 ) {
        e.source.getRange(oldRow+":"+oldRow).setBackground("#fff");
      }
      
      if ( range.getNumRows() === 1 ) {
        let row = range.getRow();
        
        e.source.getRange(row+":"+row).setBackground("#f3f3f3");
        
        cache.put("oldRow", row);
      }
    }


    Или такую:
    function onSelectionChange ( e ) {
      let range = e.range;
      
      e.source.getRange("A:A").setValue("");
      
      if ( range.getNumRows() === 1 ) {
        let row = range.getRow();
        
        e.source.getRange("A"+row).setValue("SELECTED");
      }
    }

    И. настроить условное форматирование:
    =IF($A1 = "SELECTED"; TRUE; FALSE)

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

    ---
    stomaks.me
    g-apps-script.com
    Ответ написан
    Комментировать
  • Как запустить отладку кода в среде Google Apps Script?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    В официальной документации гляньте
    https://developers.google.com/apps-script/guides/s...
    Ответ написан
    Комментировать
  • Как склонировать содержимое документа GoogleDocs в него же?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Этот код копирует весь контент из текущего документа в другой.

    var doc_prototype = DocumentApp.getActiveDocument();
    var otherBody = doc_prototype.getBody();
    
    // Это можно заменить на текущий документ
    var doc = DocumentApp.openById(  "document_id" );
    var body = doc.getBody();
          
    var totalElements = otherBody.getNumChildren();
    
    // Тут можно вставить цикл для вставки содержимого нужное количество раз
    for( var j = 0; j < totalElements; ++j ) {
            var element = otherBody.getChild(j).copy();
            var type = element.getType();
            if( type == DocumentApp.ElementType.PARAGRAPH )
              body.appendParagraph(element);
            else if( type == DocumentApp.ElementType.TABLE )
              body.appendTable(element);
            else if( type == DocumentApp.ElementType.LIST_ITEM )
              body.appendListItem(element);
            else if( type == DocumentApp.ElementType.INLINE_IMAGE )
              body.appendImage(element);
            // add other element types as you want
            
            else
              throw new Error("According to the doc this type couldn't appear in the body: "+type);
          }
          
    body.appendPageBreak();


    ---
    stomaks.me
    g-apps-script.com
    Ответ написан
    Комментировать
  • Как создать запрос на Нову пошту из google script?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Сделайте так:

    function getCities () {
      const formData = {
        // Ваш ключ API 2.0
        "apiKey": apiKey,
        
        "modelName": "Address",
        
        "calledMethod": "getCities"
      };
      
      const options = {
        "method": "POST",
        "headers": {
          "Content-Type": "application/json"
        },
        "payload": JSON.stringify(formData)
      };
      
      const url = "https://api.novaposhta.ua/v2.0/json/getCities";
      
      const response = UrlFetchApp.fetch(url, options);
      
      Logger.log( response.getContentText() );
      
      return response.getContentText();
    };


    ---
    stomaks.me
    g-apps-script.com
    Ответ написан
    6 комментариев
  • Проверка совпадений с помощью Google Apps Script прямо в Google Forms?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    При помощи гугл скриптов этого сделать нельзя.
    Так как скрипты не имеют апи интерфейса.

    Как очень костыльный вариант вы можете написать расширение для браузера и предлагать его устанавливать пользователям для прохождения формы,
    Ответ написан
    Комментировать
  • Запись значения в Google таблицу по щелчку кнопки с сайта?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Нужно создать функцию doGet(), в ней реализовать механизм изменения данных в таблице, затем развернуть скрипт как веб-приложение от своего имени и доступный для всех пользователей в интернете.

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

    Примерно так
    // В гугл таблице
    function doGet ( e ) {
      var ss0 = SpreadsheetApp.getActiveSpreadsheet();
      var ss0_s0 = ss0.getSheetByName("Лист1");
      
      var row = e.parameter.row;
      var val = e.parameter.val;
      
      ss0_s0.getRange("B" + row).setValue( val );
      
      return true;
    }
    
    
    
    // У вас на сайте
    $("#my-button-id").on("click", function () {
      var url = ""; // Тут указать url который получили при разворачивании веб приложения
      var row = 1; // Получить строку
      var val = "0"; // Получить данные
    
      // Отправить данные
      $.ajax({
        type: "GET",
        url: `${ url }?row=${ row }&val=${ val }`,
        dataType: 'jsonp',
        crossDomain: true,
        success: function ( data ) {}, // В случае успеха
        failure: function ( error ) {} // В случае провала
      });
    });


    https://g-apps-script.com - русскоязычный учебник по google apps script
    Ответ написан
    Комментировать
  • Как реализовать непрерывную передачу данных из таблицы в сайдбар?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Это лучше всего реализовать через рекурсивынй вызов функции в самом коде сайдбара:

    что-то вроде того

    function getData ( data ) {
      // Тут обработка полученных данных
      
      // Тут можно реализовать условие прекращение получения данных
    
      // Повторный запрос данных
      google.script.run
      .withSuccessHandler( getData ) // Название текущей функции
      .getData() // Название функции на сервере
    }


    https://g-apps-script.com - русскоязычный учебник по google apps script
    Ответ написан
    Комментировать
  • При измнении ячейки - очищать ячейки(определенные) на другом листе. Как организовать?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Алгоритм таков:
    Пишите функцию onEdit(), в нее ставите условия название текущего листа, затем получаете активную ячейку, проверяете входит ли она в ваш диапазон.
    Если да то получаете второй лист, получаете нужный диапазон, и очищаете его.

    function onEdit () {
      var ss0 = SpreadsheetApp.getActiveSpreadsheet();
      
      var ss0_s1 = ss0.getActiveSheet();
      
      if ( ss0_s1.getName() === "Лист1" ) {
        var temp = ss0_s1.getActiveCell();
        var row = temp.getRow();
        var col = temp.getColumn();
        
        if ( (row >= 1 && row <= 5) && col == 1 ) {
          var ss0_s2 = ss0.getSheetByName("Лист2");
          
          ss0_s2.getRange("B11:B23").setValue("FALSE");
        }
      }
    }


    https://g-apps-script.com - русскоязычный учебник по google apps script
    Ответ написан
    Комментировать
  • Как очистить аркуш через google app script только оставить рядок 1:1?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Это вам поможет:
    https://developers.google.com/apps-script/referenc...

    или это
    https://developers.google.com/apps-script/referenc...

    https://g-apps-script.com - русскоязычный учебник по google apps script
    Ответ написан
    Комментировать
  • JS GAS как отловить обращение к несуществующему свойству объекта?

    stomaks
    @stomaks
    Разработчик Google Apps Script (stomaks.me)
    Я решил этот вопрос так.

    Создал функцию через которую запускаю другие.
    function run ( fnc, arg ) {
    try {
        // Пробуем запустить функцию
        return CORE[fnc]( arg );
      } catch ( error ) {}
    }


    А все остальные функции записал в одну глобальную переменную.
    CORE = {
      func1: function ( data ) {
        // код
      },
      func2: function ( data ) {
        // код
      }
    };


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

    В моем случае я имею возможность запустить функцию. лежащую в любой иерархии CORE.obj.obj.func1( arg );
    Если интересно, пишите расскажу как это сделать.

    ___
    https://g-apps-script.com - русскоязычный учебник по google apps script
    Ответ написан