在电子表格中,我有两张,*和计算器。当我更改“*”上的值!B1(即表格 *的单元格B1)时,我想运行脚本:更改(实际清除)“计算器”的值!B3(< em>即表“计算器”的单元格B3 )。
这是我的代码。我是通过Spreadsheet&gt;创建的。工具&gt;脚本编辑器,所以它不是独立的:
版本1和版本2之间的区别在于版本1 第一个功能正在运行而第二个功能未通过(反之亦然版本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");
//}
//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");
会产生影响。显然,它没有。
错误是什么?错误在哪里?
答案 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()
}
}
缩进只是因为线条不会太长。