Как сделать так, чтобы скрипт Google Sheet надежно работал на планшетах Samsung? - PullRequest
1 голос
/ 11 октября 2019

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

Сценарий настроен для выполнения проверки onEdit двух ячеек флажков. Если установлен флажок в ячейке C3, должна быть запущена функция AUTOFILL (которая отображает значение ячейки A последней строки на информационном листе, плюс 1 в ячейке C4 листа ввода данных, а затем снимает флажок), и еслиВ ячейке C12 установлен флажок, должна запускаться функция SUBMIT (которая берет диапазон данных, введенных в лист ввода данных, и обновляет существующую строку / добавляет новую строку в лист данных с информацией из листа ввода данных, добавляяотметка времени, если ячейка C11 на листе ввода данных содержит слово «CLEANED», а затем снимает флажок).

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

Это из-за обработки, необходимой для запуска этого кода? Я пытался максимально оптимизировать его, но есть ли что-то еще, что я мог бы изменить здесь, чтобы это работало каждый раз?

Здесь - это пример листа, ивот сценарий:

function onEdit(e) {
   if (e.range.getSheet().getName() != "Data Entry") {
       return
   }

  var isAutofill = SpreadsheetApp.getActiveSheet().getRange("C3").getValue();
  var isSubmit = SpreadsheetApp.getActiveSheet().getRange("C12").getValue();

    if (isAutofill && isSubmit) {
    Browser.msgBox("You cannot autofill and submit data at the same time!");
    SpreadsheetApp.getActiveSheet().getRange("C3").setValue(false);
    SpreadsheetApp.getActiveSheet().getRange("C12").setValue(false);
  } else if (isAutofill) {
    AUTOFILL();
    SpreadsheetApp.getActiveSheet().getRange("C3").setValue(false);
  } else if (isSubmit) {
    SUBMIT();
    SpreadsheetApp.getActiveSheet().getRange("C12").setValue(false);
  }
}


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


function SUBMIT() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Data Entry");
var dataSheet = ss.getSheetByName("Info");

var values = formSS.getRange("C4:C11").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, 8).getValues()[0].map(function (el, ind){
  return el = values[ind] ? values[ind] : el;
  })

var statusValue = formSS.getRange("C11").getValue();

if (statusValue != 'CLEANED') {
dataSheet.getRange(row, 1, 1, 8).setValues([data]);
}

if (statusValue == 'CLEANED') {
var now = [new Date()];
var newData =  data.concat(now)
dataSheet.getRange(row, 1, 1, 9).setValues([newData]);
}

formSS.getRange("C4:C11").clearContent()
}

1 Ответ

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

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

function onEdit(e) {
  var sh=e.range.getSheet();
  if (sh.getName() != "Data Entry") {return;}
  var rgC3=SpreadsheetApp.getActiveSheet().getRange("C3");
  var rgC12=SpreadsheetApp.getActiveSheet().getRange("C12");
  var isAutofill = rgC3.getValue();
  var isSubmit = rgC12.getValue();

  if (isAutofill && isSubmit) {
    e.source.toast("You cannot autofill and submit data at the same time!");
    rgC3.setValue(false);
    rgC12.setValue(false);
  } else if (isAutofill) {
    AUTOFILL(e.source);
    rgC3.setValue(false);
  } else if (isSubmit) {
    SUBMIT(e.source);
    rgC12.setValue(false);
  }
}

function AUTOFILL(ss) {
  var sheet1 = ss.getSheetByName('Info');
  var sheet2 = ss.getSheetByName('Data Entry');
  var valueOfData = sheet1.getRange(sheet1.getLastRow(), 1).getValue();
  sheet2.getRange('C4').setValue(valueOfData + 1);
} 

function SUBMIT(ss) {
var formSS=ss.getSheetByName("Data Entry");
var dataSheet=ss.getSheetByName("Info");
var values=formSS.getRange("C4:C11").getValues().reduce(function(a, b) {return a.concat(b)});
var partNum = values[0];
var row;
var data=dataSheet.getDataRange().getValues()
for(var i=0;i<data.length;i++) {
  if(data[i][0]==partNum) {
    row=i+1;
    break;
  }
}
row = row ? row : dataSheet.getLastRow() + 1;
var data = dataSheet.getRange(row, 1, 1, 8).getValues()[0].map(function (el, ind){return el = values[ind] ? values[ind] : el;})
var statusValue = formSS.getRange("C11").getValue();
if (statusValue != 'CLEANED') {dataSheet.getRange(row, 1, 1, 8).setValues([data]);}
if (statusValue == 'CLEANED') {var now = [new Date()];var newData=data.concat(now);dataSheet.getRange(row, 1, 1, 9).setValues([newData]);}
formSS.getRange("C4:C11").clearContent();
}
...