Ale*_*ava 4 google-apps-script
在电子表格中,我有两张工作表, * 和Calculator。当我更改“*”!B1(即工作表* 的单元格 B1)上的值时,我想运行脚本:更改(实际上是清除)“计算器”的值!B3(即工作表“计算器”的单元格 B3)。
这是我的代码。我是通过电子表格 > 工具 > 脚本编辑器创建的,所以它不是独立的:
版本 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");
//}
Run Code Online (Sandbox Code Playgroud)
//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");是否会有所不同。显然,它没有。
什么是错误?
根据您的变量名称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)
缩进只是为了使行不会太长。
| 归档时间: |
|
| 查看次数: |
26374 次 |
| 最近记录: |