【问题标题】:How to get cell location whose value is changed with reference to other cell value in Google Apps Script如何获取参考 Google Apps 脚本中的其他单元格值更改其值的单元格位置
【发布时间】:2021-02-15 15:22:42
【问题描述】:

我有一张表格,只要在其中进行编辑,例如在单元格“A1”中,该单元格的背景颜色就会变为绿色。我正在使用编辑触发器。当我在单元格“A1”中手动输入值时,这有效。

但是如果这个单元格与另一个单元格“B2”相连,并且“B2”单元格中的任何更改都会自动更改单元格“A1”中的值,但是当它发生时,背景颜色不会改变。我认为这是因为我没有手动编辑值。有什么方法可以改变单元格“A1”的背景颜色,因为它的值由于另一个单元格而改变?希望你明白了。我正在使用以下脚本。任何帮助将不胜感激。

function HighlightCell() {

  var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var cell  = Sheet.getActiveCell();
 
  Logger.log(cell);
 
  SpreadsheetApp.flush();
  cell.setValue("Highlighted");
  
  SpreadsheetApp.flush();  
  cell.setBackground("green");
}

【问题讨论】:

  • onEdit 触发器仅在用户编辑时激活。公式或脚本不能触发onEdit 函数。恐怕你必须重新设计你的逻辑。
  • 注明。对于这个问题,您有什么解决方案推荐吗?
  • Carlos 提供了一个解决方法。本质上,您需要找到一种方法将源单元格 (B1) 的手动编辑链接到目标单元格 (A1) 。如果单元格之间没有链接,那么您将无能为力。一个想法是让您的脚本检查 A 列的所有公式并调整其公式与手动编辑的单元格相关的单元格。您可以使用getFormulas,然后检查是否编辑单元格B1,哪些公式会受到影响,然后调整这些单元格的颜色。存在变通办法,问题是您对这些变通办法的开放程度。

标签: google-apps-script google-sheets google-sheets-formula google-sheets-api


【解决方案1】:

onEdit(e) 简单触发器中的参数 Event Object 将始终指向最后一个手动编辑的单元格,因此在您的示例中,e.range 将指向单元格 B2,无论它对其他单元格所做的任何更改。

您可以编辑触发器以检查是否在定义的单元格而不是 A1 中进行了编辑,并将 cell 范围指向公式中的子字符串:

function onEdit(e) {
  if (e.range.getSheet().getName() == "Sheet1") {
    var formula = e.range.getFormula();
    if (formula != "") {
      HighlightCell(formula.substring(1));
    }
  }
}

function HighlightCell(cellNotation) {
  var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var cell  = Sheet.getRange(cellNotation); 
  cell.setValue("Highlighted");
  cell.setBackground("green");
}

示例:

参考:

Simple Triggers: onEdit(e)

【讨论】:

  • 问题是我给出了单元格“A1”的示例,有许多单元格是参考其他单元格进行编辑的,但一次编辑一个单元格。所以它并不总是“A1”。
  • 如果你有一个引用的单元格列表,你可以将它们插入一个数组并循环检查是否包含编辑的单元格。你可以使用我编辑的代码。
  • 感谢您的帮助,但随着数据不断增加,这不可行,因此我们无法制作数组。
  • 如果存在参考模式,例如,B 列中的手动编辑将突出显示 A 列中的相应单元格,则可以计算范围。但如果没有,那么数组是最好的解决方案。
  • @Carlos 如果您想在问题的评论中看到我的解决方法评论。也许您想花一些时间来解决这个问题。当然,这取决于你。无论如何我都投了赞成票:)
【解决方案2】:

我已经设法通过遵循公式概念找到了解决方案。因此,如果您在 sheet2 中并在使用公式与 sheet1 的单元格链接的单元格中输入值,那么它将突出显示 sheet1 中的单元格。任何有类似需求的人都可以使用此功能。这是一个代码:

function FormulaGet(e) {
  
  if (e.range.getSheet().getName() == "Sheet2") {
    
  var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var Notation  = Sheet.getActiveRange().getA1Notation();
  Notation = Notation.toString();  
  var cell = Sheet.getActiveCell();
  Logger.log(Notation);
  var row = cell.getRow()
  Logger.log(row);
  var col = cell.getColumn();
  Logger.log(col);
    var Sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
    var formulas = Sheet1.getRange("Sheet1!B2:Q40").getFormulas();
    checkElement(formulas,Notation);
     
    }
}

function checkElement(array, str) {
  var item;
  var item1;
  for (var i = 0; i < array.length; i++) {
    item = array[i];
    
    if (item.includes(str) === true || Array.isArray(item) && checkElement(item, str)) {
      item1=item.substring(8,10)
      Logger.log(item1);
      var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      Sheet.getRange(item1).setBackground("#b7e1cd");
     
      return true;
    }
  }
  
  return false;
}   

您可以根据需要设置范围。我已经根据我的需要设置了我的范围(B2:Q40)。感谢@Carlos 和@Marios 为我指引正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多