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

时间:2016-12-08 06:38:58

标签: google-apps-script

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

这是我的代码。我是通过Spreadsheet&gt;创建的。工具&gt;脚本编辑器,所以它不是独立的:

版本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");
//}

第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");
}

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

有两个功能(两个版本都相同)的想法是因为我不知道使用ss.getSheetByName("Calculator").getSheetName();还是直接选择in ss.getSheetByName("*").getRange("B1");会产生影响。显然,它没有。

错误是什么?错误在哪里?

1 个答案:

答案 0 :(得分:4)

按照您的变量名称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");

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

此外,通过您的代码,您将获得编辑范围,然后您将获得始终是相同单元格的活动单元格。所以你可能有逻辑if (1 == 1)或更具体,因为你正在比较范围类型对象,它就像写if (1 == 2)

编辑:根据此答案的评论中考虑的事项,您需要将事情变得更加复杂。只有B1:B3中的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()      
    }
  }

你可以通过

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

      SpreadsheetApp
        .getActiveSpreadsheet()
          .getSheetByName('Calculator')
            .getRange('B1:B3')
              .clear() 
    }
  }

缩进只是因为线条不会太长。