【问题标题】:onEdit(e) script works halfway but when I change it to script run when I click it works - need it to work for mobileonEdit(e) 脚本中途工作,但是当我将其更改为脚本运行时,单击它可以工作 - 需要它在移动设备上工作
【发布时间】:2022-01-01 07:31:18
【问题描述】:

新年快乐 - 在此先感谢您帮助我! 我需要在手机上运行我的脚本。该脚本可以在桌面上完美运行,因为我可以在一个按钮上单击它,但是当我将其更改为“onEdit(e)”脚本时,它只能部分工作。 这是脚本应该在移动设备上运行的源页面 - https://docs.google.com/spreadsheets/d/1Wq8jI87A2PkRuwnDzl0fjV7bUSRPkc6JfRQNLvYBN_s/edit?usp=sharing

这是脚本将数据发送到的目标页面 - https://docs.google.com/spreadsheets/d/1CYZO6fP3APscxDLS881x3eJ9YEC9ydBXDxvmPaSUwU0/edit?usp=sharing

这是脚本-

function checkValue() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var s = ss.getSheetByName("SCAN");
 var valueToCheck = s.getRange("A5").getValue();
 
 
 if (valueToCheck == true){
      
    var theRoll = s.getRange("A4").getValue();
    var statusPage = SpreadsheetApp.openById('1CYZO6fP3APscxDLS881x3eJ9YEC9ydBXDxvmPaSUwU0');
    var statusSheet = statusPage.getSheetByName("DailyCut");
    var lr1=statusSheet.getLastRow();
    var range = statusSheet.getRange(2,1,lr1-1,4).getValues();
    var barCode = s.getRange("A2").getValue();
     
      for (var j = 0; j < range.length; j++) {
             if(barCode==range[j][1]){
             statusSheet.getRange(j+2,16).setValue(new Date()).setNumberFormat('h:mm');
             statusSheet.getRange(j+2,14).setValue("Robin");
             statusSheet.getRange(j+2,15).setValue(new Date()).setNumberFormat('dd-mm-yyyy');
             statusSheet.getRange(j+2,17).setValue(theRoll);
             j = range.length;
     
     }
      }
      
      s.getRange(2,1).setValue("");
      s.getRange(4,1).setValue("");
      s.getRange(5,1).setValue(false);
}
}

【问题讨论】:

标签: google-apps-script eventtrigger


【解决方案1】:

如果您使用复选框来触发您的功能,那么这应该适合您。只需记住将您的函数重命名为 onEdit 以外的其他名称并创建一个 可安装触发器并添加 e 以从触发器中收集事件对象

function newfunctionname(e) {
  const s = e.range.getSheet();
  if (s.getName() == 'SCAN' && e.range.columnStart == 1 && e.range.rowStart == 5 && e.value == "TRUE") {
    e.range.setValue("FALSE");//set the check box back to false      
    var theRoll = s.getRange("A4").getValue();
    var statusPage = SpreadsheetApp.openById('1CYZO6fP3APscxDLS881x3eJ9YEC9ydBXDxvmPaSUwU0');
    var statusSheet = statusPage.getSheetByName("DailyCut");
    var lr1 = statusSheet.getLastRow();
    var range = statusSheet.getRange(2, 1, lr1 - 1, 4).getValues();
    var barCode = s.getRange("A2").getValue();
    for (var j = 0; j < range.length; j++) {
      if (barCode == range[j][1]) {
        statusSheet.getRange(j + 2, 16).setValue(new Date()).setNumberFormat('h:mm');
        statusSheet.getRange(j + 2, 14).setValue("Robin");
        statusSheet.getRange(j + 2, 15).setValue(new Date()).setNumberFormat('dd-mm-yyyy');
        statusSheet.getRange(j + 2, 17).setValue(theRoll);
        j = range.length;

      }
    }
    s.getRange(2, 1).setValue("");
    s.getRange(4, 1).setValue("");
    s.getRange(5, 1).setValue(false);
  }
}

function createinstallableonedittrigger() {
 if(ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == "newfunctionnname").length == 0) {
   ScriptApp.newTrigger('newfunctionname').forSpreadsheet(SpreadsheetApp.getActive()).onEdit().create();
 }
}

【讨论】:

  • 你能指导我如何创建一个可安装的触发器。发布后,我做了一些研究,发现 onEdit 无法在其他电子表格上发布数据,因此您找到了一个不错的解决方法,但我确实需要一些有关如何创建此触发器的指导。提前谢谢你。
  • 您好@user1799724!您能否说明在触发器创建过程中需要帮助的地方?
  • 抱歉含糊不清 - 问题是 onEdit 在桌面和移动设备上触发脚本,但 onEdit 无法将数据写入新电子表格,因此它不起作用 - 当我单击时脚本如何知道运行复选框。我看到函数 createinstallableonedittrigger() - 我如何使用它 - 抱歉,我是新手,所以这可能是一个非常愚蠢的问题。我是否需要部署或其他东西,然后才能将数据放在另一个电子表格中
  • 非常感谢大家的帮助和时间。非常感谢
  • @user1799724 触发器未触发,因为它尚未创建。要创建它,您应该运行一次createinstallableonedittrigger 函数。该函数将检查触发器是否存在,如果不存在,它将创建它。要运行该功能,请在Apps Script IDE 上打开项目,选择该功能并单击Run
【解决方案2】:

Cooper's answer 上阅读您的 cmets 后,我正在写此答案以扩大其清晰度,以帮助您和社区。首先,我建议您熟悉installable triggers。 Cooper 在函数 createinstallableonedittrigger 上开发了一个可编辑的可安装触发器。正如文档所说,一个可编辑的可安装触发器:

当用户修改一个值时,一个可安装的编辑触发器运行 电子表格。

createinstallableonedittrigger 在创建触发器之前运行检查。它正在检查具有相同名称 (newfunctionname) 的触发器是否已经存在,如果不存在,则继续创建它。为此,代码是filteringgetProjectTriggers 拉动的现有触发器数组,如果答案为空(读取为零长度),则继续创建触发器。所以正如我在comment 中解释的那样,您应该运行一次函数createinstallableonedittrigger 来创建触发器。

触发逻辑被编码到newfunctionname 函数中。注意它是如何使用e (event object) 参数来分析触发动作的。特别是,它使用range 属性来获取Range 对象。最后,脚本运行您的触发器操作。如果您需要进一步说明,请告诉我。为了便于阅读,我在此分享一份 Cooper 的脚本:

function newfunctionname(e) {
  const s = e.range.getSheet();
  if (s.getName() == 'SCAN' && e.range.columnStart == 1 && e.range.rowStart ==
    5 && e.value == "TRUE") {
    e.range.setValue("FALSE"); //set the check box back to false      
    var theRoll = s.getRange("A4").getValue();
    var statusPage = SpreadsheetApp.openById(
      '1CYZO6fP3APscxDLS881x3eJ9YEC9ydBXDxvmPaSUwU0');
    var statusSheet = statusPage.getSheetByName("DailyCut");
    var lr1 = statusSheet.getLastRow();
    var range = statusSheet.getRange(2, 1, lr1 - 1, 4).getValues();
    var barCode = s.getRange("A2").getValue();
    for (var j = 0; j < range.length; j++) {
      if (barCode == range[j][1]) {
        statusSheet.getRange(j + 2, 16).setValue(new Date()).setNumberFormat(
          'h:mm');
        statusSheet.getRange(j + 2, 14).setValue("Robin");
        statusSheet.getRange(j + 2, 15).setValue(new Date()).setNumberFormat(
          'dd-mm-yyyy');
        statusSheet.getRange(j + 2, 17).setValue(theRoll);
        j = range.length;

      }
    }
    s.getRange(2, 1).setValue("");
    s.getRange(4, 1).setValue("");
    s.getRange(5, 1).setValue(false);
  }
}

function createinstallableonedittrigger() {
  if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() ==
      "newfunctionnname").length == 0) {
    ScriptApp.newTrigger('newfunctionname').forSpreadsheet(SpreadsheetApp
      .getActive()).onEdit().create();
  }
}

【讨论】:

  • 谢谢 - 这有帮助 - 我会再试一次 - 我还没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多