Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 输入的工作表未定义_Javascript_Google Apps Script_Google Sheets_Undefined_Validation - Fatal编程技术网

Javascript 输入的工作表未定义

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

我有一个包含收入和支出数据的电子表格。这是一个电子表格,其中包含了经过编辑的数据:

我想创建一个脚本,通过强制用户输入日期来验证C列中的数据。一旦输入了日期,我想在它下面返回一个新行。代码的工作原理是验证数据并输入新行,但当我在C96中输入日期时,新行将当前位于C100中的“日期”单元格向下推到C101,并表示日期无效。我对代码进行了设置,使其能够重新运行脚本,而不是验证C101数据。此外,“getRange”方法也会出错。它的意思是“TypeError:无法调用undefined的方法”getRange“ 目前,我为dateValidation函数提供了onEdit和onOpen触发器,为addRow函数提供了onEdit触发器

出于某种原因,在我的原始文件中,尽管有这些错误,代码仍然运行。我在下面的代码中用星号标出了错误的位置。一般来说,我对谷歌脚本/编程非常陌生,如果有人能帮助我,我将不胜感激

这是我目前的代码:

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就在你需要它们之前。