Javascript 输入的工作表未定义
我有一个包含收入和支出数据的电子表格。这是一个电子表格,其中包含了经过编辑的数据: 我想创建一个脚本,通过强制用户输入日期来验证C列中的数据。一旦输入了日期,我想在它下面返回一个新行。代码的工作原理是验证数据并输入新行,但当我在C96中输入日期时,新行将当前位于C100中的“日期”单元格向下推到C101,并表示日期无效。我对代码进行了设置,使其能够重新运行脚本,而不是验证C101数据。此外,“getRange”方法也会出错。它的意思是“TypeError:无法调用undefined的方法”getRange“ 目前,我为dateValidation函数提供了onEdit和onOpen触发器,为addRow函数提供了onEdit触发器 出于某种原因,在我的原始文件中,尽管有这些错误,代码仍然运行。我在下面的代码中用星号标出了错误的位置。一般来说,我对谷歌脚本/编程非常陌生,如果有人能帮助我,我将不胜感激 这是我目前的代码:Javascript 输入的工作表未定义,javascript,google-apps-script,google-sheets,undefined,validation,Javascript,Google Apps Script,Google Sheets,Undefined,Validation,我有一个包含收入和支出数据的电子表格。这是一个电子表格,其中包含了经过编辑的数据: 我想创建一个脚本,通过强制用户输入日期来验证C列中的数据。一旦输入了日期,我想在它下面返回一个新行。代码的工作原理是验证数据并输入新行,但当我在C96中输入日期时,新行将当前位于C100中的“日期”单元格向下推到C101,并表示日期无效。我对代码进行了设置,使其能够重新运行脚本,而不是验证C101数据。此外,“getRange”方法也会出错。它的意思是“TypeError:无法调用undefined的方法”get
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("General Ledger");
// Get row of first revenue
var firstRowRevLookup = 'Revenue';
var firstRowRange = sheet.getRange('B1:B');
var firstRowValues = firstRowRange.getValues();
var x = [];
for (var i = 0; i<firstRowValues.length; i++) {
if(firstRowValues[i] == firstRowRevLookup) {
x.push(i+3);
}
}
var firstRowRevenue = Number(x);
Logger.log(firstRowRevenue);
//Get row of last revenue
var lastRowRevLookup = 'End Revenues';
var lastRowRange = sheet.getRange('C1:C');
var lastRowValues = lastRowRange.getValues();
var y = [];
for (var i = 0; i < lastRowValues.length; i++) {
if(lastRowValues[i] == lastRowRevLookup) {
y.push(i);
}
}
var lastRowRevenue = Number(y);
Logger.log(lastRowRevenue)
//Get row of first expense
var firstRowExLookup = 'Expenses';
var z = [];
for(var i = 0; i<firstRowValues.length; i++) {
if(firstRowValues[i] == firstRowExLookup){
z.push(i+3);
}
}
var firstRowExpense = Number(z);
Logger.log(firstRowExpense);
//Get row of last expense
var lastRowExLookup = 'End Expenses';
var q = [];
for(var i = 0; i <lastRowValues.length; i++) {
if( lastRowValues[i] == lastRowExLookup) {
q.push(i);
}
}
var lastRowExpense = Number(q);
Logger.log(lastRowExpense);
dateValidationExpenses(sheet, firstRowExpense, lastRowExpense);
dateValidationRevenue(sheet, firstRowRevenue, lastRowRevenue);
//User must enter date into column C
function dateValidationExpenses(sheet, firstRowExpense, lastRowExpense) {
// Logger.log(sheet);
**var dateRange = sheet.getRange(firstRowExpense, 3, lastRowExpense-firstRowExpense+1);**
//Logger.log(dateRange);
var rule = SpreadsheetApp.newDataValidation()
.requireDate()
.setAllowInvalid(false)
.setHelpText('Please enter date using format "=date(year,month,day)"')
.build();
dateRange.setDataValidation(rule);
dateRange.setFontWeight('normal');
}
//User must enter date into column C
function dateValidationRevenue(sheet,firstRowRevenue,lastRowRevenue) {
**var dateRange = sheet.getRange(firstRowRevenue, 3, lastRowRevenue-firstRowRevenue+1);**
var rule = SpreadsheetApp.newDataValidation()
.requireDate()
.setAllowInvalid(false)
.setHelpText('Please enter a date using format "=date(year,month,day)"')
.build();
dateRange.setDataValidation(rule);
dateRange.setFontWeight('normal');
}
function addRowExpenses () {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('General Ledger');
var testCell = sheet.getRange(lastRowExpense,3).getValue();
//Logger.log(testCell);
if (testCell !== '') {
sheet.insertRows(lastRowExpense+1);
}
}
function addRowRevenue () {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('General Ledger');
var testCell = sheet.getRange(lastRowRevenue,3).getValue();
//Logger.log(testCell);
if (testCell !== '') {
sheet.insertRows(lastRowRevenue+1);
}
}
function editTrigger1() {
var sheet = SpreadsheetApp.getActive()
ScriptApp.newTrigger('addRowExpenses')
.forSpreadsheet(sheet)
.onEdit()
.create();
}
function editTrigger2() {
var sheet = SpreadsheetApp.getActive()
ScriptApp.newTrigger('addRowRevenue')
.forSpreadsheet(sheet)
.onEdit()
.create();
}
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“总账”);
//获得第一排收入
var firstRowRevLookup=‘收入’;
var firstRowRange=sheet.getRange('B1:B');
var firstRowValues=firstRowRange.getValues();
var x=[];
对于(var i=0;i变量sheet
在函数外部声明,这使其成为“全局变量”。无需传递sheet
目前:
dateValidationExpenses(sheet, firstRowExpense, lastRowExpense);
dateValidationRevenue(sheet, firstRowRevenue, lastRowRevenue);
改为:
dateValidationExpenses(firstRowExpense, lastRowExpense);
dateValidationRevenue(firstRowRevenue, lastRowRevenue);
sheet
可供dateValidationExpenses
函数使用,无需传递。这将解决您在此行中遇到的错误问题:
var dateRange = sheet.getRange(firstRowExpense, 3, lastRowExpense-firstRowExpense+1);
变量sheet
在函数外部声明,这使其成为“全局变量”。您不需要传递sheet
目前:
dateValidationExpenses(sheet, firstRowExpense, lastRowExpense);
dateValidationRevenue(sheet, firstRowRevenue, lastRowRevenue);
改为:
dateValidationExpenses(firstRowExpense, lastRowExpense);
dateValidationRevenue(firstRowRevenue, lastRowRevenue);
sheet
可供dateValidationExpenses
函数使用,无需传递。这将解决您在此行中遇到的错误问题:
var dateRange = sheet.getRange(firstRowExpense, 3, lastRowExpense-firstRowExpense+1);
我看到在示例脚本中,您按名称将工作表称为“总账”,但示例电子表格中的工作表名称显示为“工作表1”。请确保它们具有相同的名称。在我的原始文件中,它被称为“总账”。很抱歉,我看到在示例脚本中,您按名称将工作表称为“总账”“总帐”,但示例电子表格中的工作表名称显示为“工作表1”。请确保它们具有相同的名称。在我的原始文件中,它被称为“总帐”。很抱歉,我看到在示例脚本中,您按名称将工作表称为“总帐”",但示例电子表格中的工作表名称显示为“工作表1”。请确保它们具有相同的名称。在我的原始文件中,它被称为“总账”。很抱歉混淆。感谢您的回复!firstRowExpense、firstRowRevenue、lastRowExpense和lastRowRevenue变量也是全局变量。当我声明并调用该函数时,sh那么,我是否也可以将它们作为参数传递呢?当我在调用和定义函数时删除所有参数时,错误就会消失。但是,我仍然有一个问题,即当我在C96中输入日期并输入新行时,C100中的“日期”单元格将变为无效。对此有什么建议吗?不要对这些参数使用全局设置。仅从工作表b中获取单元格在您需要它们之前。感谢您的回复!firstRowExpense、firstRowRevenue、lastRowExpense和lastRowRevenue变量也是全局变量。当我声明和调用函数时,是否也应该将它们作为参数传递?当我在调用和定义函数时删除所有参数时,错误会消失。但是,我仍然有p当我在C96中输入日期并输入新行时,C100中的“Date”单元格出现问题。对此有何建议?不要使用全局变量。在需要之前从工作表中获取单元格。感谢您的回复!firstRowExpense、firstRowRevenue、lastRowExpense和lastRowRevenue变量也是全局变量。当我声明并调用t时函数,我是否也应该将它们作为参数传递?当我在调用和定义函数时删除所有参数时,错误就会消失。但是,当我在C96中输入日期并输入新行时,C100中的“日期”单元格仍然存在无效的问题。对此有什么建议吗?不要对这些单元格使用全局设置。获取单元格fr就在你需要它们之前。