Используя флажки для запуска различных сценариев, затем снимите - PullRequest
0 голосов
/ 07 октября 2019

У меня есть Google Sheet , настроенный с помощью двух кнопок на листе формы, которые прикреплены к двум различным сценариям. Они отлично работают на ПК, но, к сожалению, пользовательские кнопки по-прежнему не работают в приложении Google Sheets для планшетов. Я смог включить обходной путь через выпадающий список, но он все еще немного привередливый, поэтому мне интересно, могу ли я вместо этого просто переключать пользователей ПК и планшетов на флажки.

Если флажок в ячейкеG3 отмечен, скрипт AUTOFILL должен быть запущен и флажок должен быть снят;впоследствии, если флажок в ячейке G5 установлен, скрипт UPDATE должен быть запущен и его флажок снят.

Каков наилучший способ сделать это, теперь, когда флажки есть в Google Sheets?

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

    function onEdit(e) {
      if (e.range.getA1Notation() == 'D3') {
        if (/^\w+$/.test(e.value)) {        
          eval(e.value)();
          e.range.clearContent();
        }
      }
    }

    function AUTOFILL() {
      var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
      var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form');
      var valueOfData = sheet1.getRange(sheet1.getLastRow(), 1).getValue();
      sheet2.getRange('B3').setValue(valueOfData + 1);
    } 

    function UPDATE() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var formSS = ss.getSheetByName("Form");
    var dataSheet = ss.getSheetByName("Data");

    var values = formSS.getRange("B3:B6").getValues().reduce(function(a, b) {
        return a.concat(b)
    });
    var partNum = values[0];
    var row;
    dataSheet.getDataRange().getValues().forEach(function(r, i) {
        if (r[0] === partNum) {
            row = i + 1
        }
    })
    row = row ? row : dataSheet.getLastRow() + 1;
    var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
      return el = values[ind] ? values[ind] : el;
      })


        var now = [new Date()];
    var newData =  data.concat(now)
    dataSheet.getRange(row, 1, 1, 5).setValues([newData]);


    formSS.getRange("B3:B6").clearContent()
    }

1 Ответ

1 голос
/ 08 октября 2019

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

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

function onEdit(e) {
  var isAutofill = SpreadsheetApp.getActiveSheet().getRange("G3").getValue();
  var isUpdate = SpreadsheetApp.getActiveSheet().getRange("G5").getValue();

  if (isAutofill && isUpdate) {
    Browser.msgBox("You cannot autofill and update at once!");
    SpreadsheetApp.getActiveSheet().getRange("G3").setValue(false);
    SpreadsheetApp.getActiveSheet().getRange("G5").setValue(false);
  } else if (isAutofill) {
    AUTOFILL();
    SpreadsheetApp.getActiveSheet().getRange("G3").setValue(false);
  } else if (isUpdate) {
    UPDATE();
    SpreadsheetApp.getActiveSheet().getRange("G5").setValue(false);
  }

  if (e.range.getA1Notation() == 'D3') {
    if (/^\w+$/.test(e.value)) {        
      eval(e.value)();
      e.range.clearContent();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...