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
Google apps script 相同的脚本在具有相同数据的不同位置执行不同的操作_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 相同的脚本在具有相同数据的不同位置执行不同的操作

Google apps script 相同的脚本在具有相同数据的不同位置执行不同的操作,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我目前从一个脚本中得到了非常奇怪的结果,该脚本设计用于在一个工作表中拍摄数据库快照,并在另一个工作表中运行脚本时存储该数据以保留记录 它以前工作过,但是现在在运行脚本之后似乎什么也没有发生。为了找到一个解决方案,我在指定的测试文件和主Google工作表上测试了脚本,但指向了重复的工作表,但每个工作表的性能都非常不同,因此我很难理解是什么导致了问题。让我解释一下: 1) 脚本指向“主”工作表。这过去是可行的,但现在snapData脚本无法生成记录。代码如下: var ss = Spreadshe

我目前从一个脚本中得到了非常奇怪的结果,该脚本设计用于在一个工作表中拍摄数据库快照,并在另一个工作表中运行脚本时存储该数据以保留记录

它以前工作过,但是现在在运行脚本之后似乎什么也没有发生。为了找到一个解决方案,我在指定的测试文件和主Google工作表上测试了脚本,但指向了重复的工作表,但每个工作表的性能都非常不同,因此我很难理解是什么导致了问题。让我解释一下:

1) 脚本指向“主”工作表。这过去是可行的,但现在snapData脚本无法生成记录。代码如下:


var ss = SpreadsheetApp.getActiveSpreadsheet();
var current = ss.getSheetByName('Fees (management)');
var database = ss.getSheetByName('Fees (data)');

var current_rows = current.getLastRow();
var database_rows = database.getLastRow() + 1;
var database_rows_new = current_rows + database_rows - 2;
var rows_new = current.getRange("A2:F" + current_rows).getValues();

database.getRange("A" + database_rows + ":F" + database_rows_new).setValues(rows_new);

}
总之,表格“费用(数据)”中的数据为A2:F,应存储在表格“费用(管理)”中。当脚本运行时,两个工作表都不会发生任何变化

2) 我复制了“费用(数据)”和“费用(管理)”并称之为“数据”和“管理”。然后,我创建了一个snapData2脚本(复制并粘贴该脚本),并将该新脚本指向复制的工作表。我将复制下面的代码以说明问题


var ss = SpreadsheetApp.getActiveSpreadsheet();
var current = ss.getSheetByName('Management');
var database = ss.getSheetByName('Data');

var current_rows = current.getLastRow();
var database_rows = database.getLastRow() + 1;
var database_rows_new = current_rows + database_rows - 2;
var rows_new = current.getRange("A2:F" + current_rows).getValues();

database.getRange("A" + database_rows + ":F" + database_rows_new).setValues(rows_new);

}
但是,脚本生成的错误
TypeError:cannotcallmethod“getLastRow”为null。(第7行,文件“snapData2”)

复制的图纸具有相同格式的相同数据,因此我不确定snapData2为何会生成此错误,但snapData不会

3) 我已经创建了一个沙盒测试文件,其中包含“费用(数据)”和“费用(管理)”选项卡,数据复制如上面的数字1所示,并复制了snapData脚本以在测试文件上运行。同样,为了澄清这个脚本,我复制了以下内容:


var ss = SpreadsheetApp.getActiveSpreadsheet();
var current = ss.getSheetByName('Fees (management)');
var database = ss.getSheetByName('Fees (data)');

var current_rows = current.getLastRow();
var database_rows = database.getLastRow() + 1;
var database_rows_new = current_rows + database_rows - 2;
var rows_new = current.getRange("A2:F" + current_rows).getValues();

database.getRange("A" + database_rows + ":F" + database_rows_new).setValues(rows_new);

}
但是在测试文件中,该脚本完全按照预期工作

我可以提供指向测试文件的链接,但不幸的是,真实文件包含敏感信息,因此无法公开:

我无法理解为什么指向重复信息的完全相同的脚本可以以如此不同的方式执行

我想要达到的是1比3好。非常感谢您提供的任何帮助。

尝试以下方法:

function func1() {
  var ss=SpreadsheetApp.getActive();
  var current=ss.getSheetByName('Fees (management)');
  var database=ss.getSheetByName('Fees (data)');  
  var rows_new=current.getRange(2,1,current.getLastRow()-1,6).getValues();
  database.getRange(database.getLastRow()+1,1,rows_new.length,rows_new[0].length).setValues(rows_new);
}
查看执行情况:

我猜问题可能是您的targetsheet中有公式,这使得脚本很难确定最后一行是什么,并且您可能实际上正在将数据复制到电子表格的最末端,这远远低于您预期的位置。所以这里有一个版本来验证这个假设。在此版本中,系统将提示您提供目标行

function testfunc1() {
  var ss=SpreadsheetApp.getActive();
  var current=ss.getSheetByName('Fees (management)');
  var database=ss.getSheetByName('Fees (data)'); 
  var rows_new=current.getRange(2,1,current.getLastRow()-1,6).getValues();
  var resp=SpreadsheetApp.getUi().prompt("Target Row", "Enter Row Number of Target", SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
  if(resp.getSelectedButton()==SpreadsheetApp.getUi().Button.OK) {
    database.getRange(parseInt(resp.getResponseText()),1,rows_new.length,rows_new[0].length).setValues(rows_new);
  }
}
试试这个:

function func1() {
  var ss=SpreadsheetApp.getActive();
  var current=ss.getSheetByName('Fees (management)');
  var database=ss.getSheetByName('Fees (data)');  
  var rows_new=current.getRange(2,1,current.getLastRow()-1,6).getValues();
  database.getRange(database.getLastRow()+1,1,rows_new.length,rows_new[0].length).setValues(rows_new);
}
查看执行情况:

我猜问题可能是您的targetsheet中有公式,这使得脚本很难确定最后一行是什么,并且您可能实际上正在将数据复制到电子表格的最末端,这远远低于您预期的位置。所以这里有一个版本来验证这个假设。在此版本中,系统将提示您提供目标行

function testfunc1() {
  var ss=SpreadsheetApp.getActive();
  var current=ss.getSheetByName('Fees (management)');
  var database=ss.getSheetByName('Fees (data)'); 
  var rows_new=current.getRange(2,1,current.getLastRow()-1,6).getValues();
  var resp=SpreadsheetApp.getUi().prompt("Target Row", "Enter Row Number of Target", SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
  if(resp.getSelectedButton()==SpreadsheetApp.getUi().Button.OK) {
    database.getRange(parseInt(resp.getResponseText()),1,rows_new.length,rows_new[0].length).setValues(rows_new);
  }
}

不,没有错误,它只是没有将信息从费用(管理)放到费用(数据)中。现在我可能会尝试从主文件运行这些数据,并在次文件上运行脚本后使用IMPORTRANGE将其带回主工作表。您是指这个屏幕吗?显示的18.26%的错误率与我知道的其他脚本故意出错有关。我在答案中添加了图像。报告称“已完成”,但仍没有出现预期的费用(管理)数据。您的Func1脚本和我的snapData脚本也会发生同样的情况。我提供了一个测试函数,并进行了一些解释。请阅读并重试。否。没有错误,只是没有将信息从费用(管理)放到费用(数据)中。现在我可能会尝试从主文件运行这些数据,并在次文件上运行脚本后使用IMPORTRANGE将其带回主工作表。您是指这个屏幕吗?显示的18.26%的错误率与我知道的其他脚本故意出错有关。我在答案中添加了图像。报告称“已完成”,但仍没有出现预期的费用(管理)数据。Func1脚本和我的snapData脚本也会发生同样的情况。我提供了一个测试函数,其中有一些解释,请阅读并重试。