Google 电子表格:在单元格值更改时运行脚本

Ale*_*ava 4 google-apps-script

在电子表格中,我有两张工作表, * 和Calculator。当我更改“*”!B1(即工作表* 的单元格 B1)上的值时,我想运行脚本:更改(实际上是清除)“计算器”的值!B3(即工作表“计算器”的单元格 B3)。

这是我的代码。我是通过电子表格 > 工具 > 脚本编辑器创建的,所以它不是独立的:

版本 1 和版本 2 之间的区别在于,在版本 1 中第一个函数运行第二个函数丢失(版本 2 中反之亦然),另外还有一件事我将在下面详述。

版本 1

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var languageSheet = ss.getSheetByName("*").getSheetName();
  var languageCell = languageSheet.getRange("B1");
  var sheets = ss.getSheets()[0];
  var languageCellCheck = sheets.getActiveCell();
  var cookingMethodSheet = ss.getSheetByName("Calculator").getSheetName();
  var cookingMethodCell = cookingMethodSheet.getRange("B3");
  var range = e.range;

  if (range == languageCell)
    cookingMethodCell.setValue("A");
}

//function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var languageCell = ss.getSheetByName("*").getRange("B1");
  var sheets = ss.getSheets()[0];
  var languageCellCheck = sheets.getActiveCell();
  var cookingMethodCell = ss.getSheetByName("Calculator").getRange("B3");
  var range = e.range;

  if (range == languageCell)
    cookingMethodCell.setValue("A");
//}
Run Code Online (Sandbox Code Playgroud)

版本 2

//function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var languageSheet = ss.getSheetByName("*").getSheetName();
  var languageCell = languageSheet.getRange("B1");
  var sheets = ss.getSheets()[0];
  var languageCellCheck = sheets.getActiveCell();
  var cookingMethodSheet = ss.getSheetByName("Calculator").getSheetName();
  var cookingMethodCell = cookingMethodSheet.getRange("B3");
  var range = e.range;

  if (range == languageCell)
    cookingMethodCell.setValue("A");
//}

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var languageCell = ss.getSheetByName("*").getRange("B1");
  var sheets = ss.getSheets()[0];
  var languageCellCheck = sheets.getActiveCell();
  var cookingMethodCell = ss.getSheetByName("Calculator").getRange("B3");
  var range = e.range;

  if (range == languageCell)
    cookingMethodCell.setValue("A");
}
Run Code Online (Sandbox Code Playgroud)

当我说“版本 1”时,我的意思是我将“*”!B1 的值从“Something”更改为“Whatever”,并且单元格“Calculator”!B3 没有更改。然后,使用版本 2,我尝试了相同的方法,但得到了相同的结果(B3 中没有变化)。

具有两个功能(两个版本相同)的想法是因为我不知道使用ss.getSheetByName("Calculator").getSheetName();或直接选择 inss.getSheetByName("*").getRange("B1");是否会有所不同。显然,它没有。

什么是错误?

Vyt*_*tas 5

根据您的变量名称var languageSheet = ss.getSheetByName("*").getSheetName();,您似乎希望languageSheet实际上是一个工作表对象而不是一个字符串。这似乎被重申了var sheets = ss.getSheets()[0];

因此,您必须编辑该行来说明var languageSheet = ss.getSheetByName("*"),同样的var cookingMethodSheet = ss.getSheetByName("Calculator")

现在真正的问题是:

if (range == languageCell)
  cookingMethodCell.setValue("A");
Run Code Online (Sandbox Code Playgroud)

这将始终返回 false。您正在比较两个不同的对象。他们永远不会一样。您需要使用类似range.getColumn()andrange.getRow()或 or 之类的东西来比较它们的列和行或 A1 表示法range.getA1Notation()。目前就像你3在两张纸上写下数字,然后问这两张纸是不是同一个东西。它们都具有相同的价值并且具有可比性,但它们永远不会是同一张纸。

此外,按照您的代码,您将获得编辑的范围,然后您将获得始终为同一单元格的活动单元格。所以你最好有逻辑if (1 == 1)或者更具体地说,因为你正在与范围类型对象进行比较,就像写作if (1 == 2)

编辑:考虑到这个答案的评论中考虑的事情,您使事情变得更加复杂,而不是他们需要的。这是一个只有在更改B1:B3in 时Calculator才会清除的函数:B1*

function onEdit(e) {
  var langName = '*'
  var langCell = 'B1'

  var curSheet = e.range.getSheet()

  if (curSheet.getName() === langName) {
    if (e.range.getA1Notation() === langCell) {
      var cookingMethodSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Calculator')
      var range = cookingMethodSheet.getRange('B1:B3')
      range.clear()      
    }
  }
Run Code Online (Sandbox Code Playgroud)

你可以通过这样做来缩短一点

function onEdit(e) {      
  if (e.range.getSheet().getName() === '*') {
    if (e.range.getA1Notation() === 'B1') {

      SpreadsheetApp
        .getActiveSpreadsheet()
          .getSheetByName('Calculator')
            .getRange('B1:B3')
              .clear() 
    }
  }
Run Code Online (Sandbox Code Playgroud)

缩进只是为了使行不会太长。