【问题标题】:Google App script onEdit function is not taking input from a cell with formulaGoogle App 脚本 onEdit 函数没有从带有公式的单元格中获取输入
【发布时间】:2020-09-06 12:21:35
【问题描述】:

我正在尝试根据进度自动更改单元格的字体颜色。所以基本上我在想的是,如果进步是 20%,颜色是灰色,如果是 45%,颜色会发生变化。

这里是函数:

function onEdit(e) {
  
  var range = e.range;
  var spreadSheet = e.source;
  var sheetName = spreadSheet.getActiveSheet().getName();
  var column = range.getColumn();
  var row = range.getRow();
  var inputValue = e.value;
  Logger.log(e.oldValue);
  Logger.log(inputValue);
  
  if(sheetName == 'Scoreboard' && column == 2 && row == 2)
  {  
    
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('A2').setValue([inputValue]);    
    if(inputValue < 10){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("black").setFontWeight("initial");
  } else if( inputValue >= 10 && inputValue < 20 ){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("dimgray").setFontWeight("initial");
  } else if( inputValue >= 20 && inputValue < 40 ){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("silver").setFontWeight("initial");
  } else if( inputValue >= 40 && inputValue < 60 ){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("palegoldenrod").setFontWeight("initial");
  } else if( inputValue >= 60 && inputValue < 80 ){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("khaki").setFontWeight("initial");
  } else if( inputValue >= 80 && inputValue < 100 ){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("yellow").setFontWeight("initial");
  } else if( inputValue == 100 ){
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard').getRange('M6').setFontColor("yellow").setFontWeight("bold");    
  }
  } 
}

首先我尝试手动更改单元格(2,2),所以当我手动更改进度时,M6中的字体颜色会自动更改,

我遇到的问题是,在单元格 (2,2) 中,我需要输入这个计算每个项目平均进度的公式:

=AVERAGE('2S VPs Plans'!H114,'2S VPs Plans'!H92,'2S VPs Plans'!H70,'2S VPs Plans'!H48,'2S VPs Plans'!H26)

当我返回“2S VPs Plans”选项卡并不断更改 4 个输入以更改平均值时,我什么也没得到,颜色也没有改变。

我相信当我在其中添加公式时,该函数会将单元格 (2,2) 读取为空。我不确定,但如果是这样,请如果你能帮助实现它。提前谢谢!

【问题讨论】:

  • 您是否有理由通过代码而不是条件格式来尝试此操作?
  • 编辑在 2S VP 计划中!H..e 仅指该编辑,而不是其他任何地方的公式
  • @chillin 据我所知,条件格式中的 if 语句必须位于将更改的同一单元格中,这对我来说不是这种情况......
  • @AimenQaissouni “据我所知,条件格式中的 if 语句......”这是错误的。我建议您发布有关如何使用 Google 表格内置条件格式的问题。

标签: javascript google-apps-script google-sheets triggers google-sheets-formula


【解决方案1】:

Google 表格/应用程序脚本编辑触发器由用户通过 Google 表格 UI 所做的更改触发。 on edit 事件对象范围属性将保存已编辑的范围。

了解上述内容后,您可以包含一些条件表达式来检查公式中引用的任何单元格是否已被编辑。示例:

function onEdit(e){
  var name = e.range.getSheet().getName();
  var a1Notation = e.range.getA1Notation();
  var a1Notations = ['H114','H92','H70','H48','H26'];
  if( name === '2S VPs Plans' && a1Notations.indexOf(a1Notation) > -1 ){

    // put here the code to apply the formatting

  }
}

【讨论】:

    【解决方案2】:

    onEdit 不适用于公式


    很遗憾,onEdit() 仅在用户编辑工作表时有效,在通过公式更新时有效。


    解决方法:如何安装 onChange 触发器并将其链接到根据另一个单元格的值更改一个单元格格式的函数。


    有一个名为 `onChange()` 的可安装触发器:

    https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onChange()

    除了 onEdit 之外,还有几个步骤可以让它工作:

    1. 您必须先安装触发器 - https://developers.google.com/apps-script/guides/triggers/installable

    通过在您的脚本中创建另一个函数来执行此操作,如下所示:

    function createTrigger() {
    var sheet = SpreadsheetApp.getActive(); // this will be the function to run
    ScriptApp.newTrigger("changeFormat")
      .forSpreadsheet(sheet) // this is the sheet it is installed on
      .onChange() // this is the type of trigger
      .create();
    }
    

    您只需要运行一次。运行。它会询问你的权限,授予他们。

    1. 将更改单元格格式的函数重命名为上面createTrigger() 函数中引用的“changeFormat”,并根据您的原始代码复制/修改此代码:
    function changeFormat() {
      
      var scoreBoard = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard')
      var inputValue = scoreBoard.getRange('A2').getValue();
      var cellToFormat = scoreBoard.getRange('M6')
      
      if (inputValue < 10){
        cellToFormat.setFontColor("black").setFontWeight("initial");
      } else if( inputValue >= 10 && inputValue < 20 ){
        cellToFormat.setFontColor("dimgray").setFontWeight("initial");
      } else if( inputValue >= 20 && inputValue < 40 ){
        cellToFormat.setFontColor("silver").setFontWeight("initial");
      } else if( inputValue >= 40 && inputValue < 60 ){
        cellToFormat.setFontColor("palegoldenrod").setFontWeight("initial");
      } else if( inputValue >= 60 && inputValue < 80 ){
        cellToFormat.setFontColor("khaki").setFontWeight("initial");
      } else if( inputValue >= 80 && inputValue < 100 ){
        cellToFormat.setFontColor("yellow").setFontWeight("initial");
      } else if( inputValue == 100 ){
        cellToFormat.setFontColor("yellow").setFontWeight("bold");    
      }
    } 
    

    我对您的代码进行了一些更改:

    • 您可以通过将对象表示法分配给变量来使代码更简洁:
    var scoreBoard = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scoreboard')
    
    • 由于您只检查一个单元格的值,您不需要知道 什么 单元格发生了变化,只需 如果 一个单元格发生了变化,因此您可以像我上面那样设置它:
    var inputValue = scoreBoard.getRange('A2').getValue();
    
    1. 保存您的代码,然后它应该可以工作了!

    注意事项

    您可以将函数changeFormat 修改为类似于onEdit(e) 的内容,只需将其设为:changeFormat(e)。然后,您可以与e 进行交互它的行为方式或包含与来自onEdite 不同的信息!您可以console.log(e) 进一步调查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多