如何在三星平板电脑上可靠地制作 Google Sheet 脚本 运行?

How can I make a Google Sheet script run reliably on Samsung tablets?

我的 Google Sheet 脚本中有两个函数,每个函数都是通过复选框触发的(因为 Google Sheets 在移动设备上无法使用图像作为按钮)。它们在 PC 上工作(相当慢),但在平板电脑上,它们往往经常失败,这也会影响 PC 用户。

脚本设置为对两个复选框单元格执行 onEdit 检查。如果选中单元格 C3 中的复选框,AUTOFILL 函数应该 运行(显示信息最后一行的 A 单元格值 sheet 加上数据条目的单元格 C4 中的 1 sheet,然后清除复选框),如果选中单元格 C12 中的复选框,则 SUBMIT 函数应该 运行(它采用在数据条目 sheet 上输入的数据范围并更新现有的 row/adds 数据 sheet 上的一个新行,其中包含来自数据条目 sheet 的信息,如果数据条目 sheet 上的单元格 C11 包含单词 [=25=,则添加时间戳],然后清除复选框)。

我已经尝试使用各种 WIFI 信号强度和更强大的平板电脑进行试验,但我无法在此处查明确切的罪魁祸首 - 有时会 运行,大多数情况下复选框只会保持选中状态,什么也不会发生。笔记本电脑和台式电脑似乎都 运行,但如果平板电脑尝试 运行 但失败了,电脑有时也不会 运行,直到我进入脚本本身并手动强制执行一次运行 的功能,这似乎重置了一些东西并让计算机再次工作。

是不是因为运行这段代码需要处理?我已尝试尽可能地对其进行优化,但我是否可以在此处进行其他更改以使其每次都能正常工作?

Here 是示例 sheet,这里是脚本:

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()
}

我做了一些修改。看一看。希望您可以使用它们来加速功能。

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();
}