Google apps script 谷歌电子表格:运行单元格值更改脚本

Google apps script 谷歌电子表格:运行单元格值更改脚本,google-apps-script,Google Apps Script,在电子表格中,我有两张表格,*和计算器。当我更改“*”上的值时!B1(即工作表*的单元格B1),我想运行脚本:更改(实际清除)“计算器”的值!B3(即表格“计算器”的单元格B3) 这是我的密码。我通过电子表格>工具>脚本编辑器创建了它,因此它不是独立的: 版本1和版本2之间的区别在于,在版本1中,运行第一个函数,而错过第二个函数(在版本2中反之亦然),还有一点我将在下面详述 版本1 版本2 当我说“版本1”时,我的意思是我更改了“*”的值!B1从“某物”到“任何东西”,以及单元格“计算器”!B

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

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

版本1和版本2之间的区别在于,在版本1中,运行第一个函数,而错过第二个函数(在版本2中反之亦然),还有一点我将在下面详述

版本1 版本2
当我说“版本1”时,我的意思是我更改了“*”的值!B1从“某物”到“任何东西”,以及单元格“计算器”!B3没有改变。然后,使用版本2,我尝试了相同的方法,但得到了相同的结果(B3没有变化)

有两个函数(两个版本相同)的想法是因为我不知道是否使用
ss.getSheetByName(“计算器”).getSheetName()或直接在中选择,如
ss.getSheetByName(“*”).getRange(“B1”)将起作用。显然,它没有


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

使用变量名
var languageSheet=ss.getSheetByName(“*”).getSheetName()
似乎您期望
languageSheet
实际上是一个工作表对象而不是字符串。这似乎得到了重申
var sheets=ss.getSheets()[0]

因此,您必须编辑该行,使其显示
var languageSheet=ss.getSheetByName(“*”
,并且
var cookingMethodSheet=ss.getSheetByName(“计算器”)

现在真正的问题是:

if (range == languageCell)
  cookingMethodCell.setValue("A");
这将始终返回false。您正在比较两个不同的对象。他们永远不会是原来的样子。您需要使用类似于
range.getColumn()
range.getRow()
range.geta1表示法()
的方法来比较它们的列和行或A1表示法。现在就像你把数字
3
写在两张纸上,然后问这两张纸是不是一样的东西。它们将具有相同的价值和可比性,但它们永远不会是同一张纸

此外,根据您的代码,您将获得编辑的范围,然后您将获得活动单元,该单元将始终是同一个单元。因此,您最好将逻辑设为
if(1==1)
,或者更具体地说,因为您要与范围类型对象进行比较,这就像编写
if(1==2)

编辑:根据此答案评论中考虑的内容,您正在使事情变得比需要的更复杂。只有在
*
中的
B1
发生更改时,此函数才会清除
Calculator
中的
B1:B3

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() 
    }
  }

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

我用你答案的第一部分修改了脚本。我如何解决第二部分(真正的问题)?我不太懂编码,这在很大程度上取决于您希望实现什么。你想用
if
语句实现什么?是否正在检查编辑的范围是否为
B1
?你需要以一种有意义的方式来阐述你的逻辑。你希望什么是真实的?这句话阻止了什么?编写代码时,首先要问自己1)你的目标是什么?2) 执行任务所需的逻辑是什么?3) 您需要处理哪些类型的变量和对象?4) 这个代码的语法是什么?按照这个顺序,代码的实际编写只会出现在#4:)a)是的,我正在尝试检查编辑的单元格是否为“*”!B1,b)因此,如果这是真的,我将更改单元格“Calculator”的值!B3到“A”(或无,无论什么)。C) 嗯,它不会阻止任何事情,除非我们对“阻止”有不同的定义哈哈。。您可以在*工作表中将其语言从西班牙语更改为英语(反之亦然)。问题是,当您这样做时,在“工作表计算器”下拉列表中选择的值仍然是西班牙语(如果是西班牙语,则为英语)。我想清除sheet Calculator中三个下拉列表的值,这样它就不会在Cooking Method中显示“Cocido/a”,而是“Cooked”(在更改语言后的下拉列表中可用)。希望你能帮助我,就这样在我的答案中添加了代码,以显示如何用更少的代码完成。基本上,您只需要获取编辑的范围。然后检查工作表是否与您希望编辑的工作表匹配。如果是,我们可以检查是否编辑了正确的范围。如果范围正确,那么我们可以清除另一个范围中的值,否则继续脚本没有意义。这就是
if
所阻止的-如果不是预期的编辑,则执行代码。然后,您只需抓取您想要清除的范围并清除它:请考虑将答案标记为正确,如果这是足够帮助的。
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() 
    }
  }