Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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,我有一个谷歌工作表,其中有受保护的数据范围,例如A2:F99,A100:F199等。现在,如果将新行数据输入到200或更高版本,它工作正常。但是,如果没有新数据输入到A200及以后,例如,不应执行突出显示的代码块(**)。当没有新的数据行时,(**)之间的代码块会在A1:F2上意外地工作。请注意,A1:F1不受保护 因此,当没有新数据时,如何对其进行编码,必须不执行突出显示的代码块 function onePeriod(){ // For a single Period Class

我有一个谷歌工作表,其中有受保护的数据范围,例如A2:F99,A100:F199等。现在,如果将新行数据输入到200或更高版本,它工作正常。但是,如果没有新数据输入到A200及以后,例如,不应执行突出显示的代码块(**)。当没有新的数据行时,(**)之间的代码块会在A1:F2上意外地工作。请注意,A1:F1不受保护

因此,当没有新数据时,如何对其进行编码,必须不执行突出显示的代码块

  function onePeriod(){
  // For a single Period Class
  var spreadsheet = SpreadsheetApp.getActive();
  var dashboard = spreadsheet.getSheetByName("Dashboard");
  var sheetName = dashboard.getRange("A4").getValue();
  //retrieve the start date to use as desired
  var startDate = dashboard.getRange("C4").getDisplayValue();
  var endDate = dashboard.getRange("D4").getDisplayValue();
  var sheet = spreadsheet.getSheetByName(sheetName);
  //chose the range within the specified dates, for this first locate the date column
  var startRow = 2;
  var dateColumn = sheet.getRange(startRow,1,sheet.getLastRow(), 1);
  var dates = dateColumn.getDisplayValues().flat();
  var firstRow = dates.indexOf(startDate)+startRow;
  var lastRow = dates.lastIndexOf(endDate)+startRow;
  //now get the range between (and including) those rows
  var range = sheet.getRange(firstRow, 1, lastRow-firstRow+1, sheet.getLastColumn());
  var newRows = lastRow-firstRow;
  
  **if(newRows > 0){  
    //Sorting and removing duplicates
    // You need to specify by which column you want to sort your data, in this sample it it column 3 - that it column C  
    var column = 3;
    range.sort({column: column, ascending:true});
    range.removeDuplicates([column]);
  
    //now delete empty rows if any
    var deleteRows = 0;  // <--- Added
    for (var i = range.getHeight(); i >= 1; i--){
        if(range.getCell(i, 1).isBlank()){
           sheet.deleteRow(range.getCell(i, 1).getRow());
           deleteRows++;
        }
    }
    
    //Protecting data 
    var timeZone = Session.getScriptTimeZone();
    var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
    var me = Session.getEffectiveUser();
    var description = 'Protected on ' + stringDate + ' by ' + me;
    var height = range.getHeight();
    var newHeight = height+1;
    var newRange = sheet.getRange(firstRow, 1, newHeight-deleteRows, sheet.getLastColumn());
  
    var protection = newRange.protect().setDescription(description);
    newRange.getCell(newHeight-deleteRows, 2).setValue(height-deleteRows + ' Students, Signed by ' + me).offset(0, -1, 1, 6).setBackground('#e6b8af');
    //protection.setDomainEdit(false);
    protection.addEditor(me);
    protection.removeEditors(protection.getEditors());
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }  
  }**
函数onePeriod(){
//一节课
var电子表格=SpreadsheetApp.getActive();
var dashboard=电子表格.getSheetByName(“dashboard”);
var sheetName=dashboard.getRange(“A4”).getValue();
//根据需要检索要使用的开始日期
var startDate=dashboard.getRange(“C4”).getDisplayValue();
var endDate=dashboard.getRange(“D4”).getDisplayValue();
var sheet=电子表格.getSheetByName(sheetName);
//选择指定日期内的范围,为此,请首先找到日期列
var startRow=2;
var dateColumn=sheet.getRange(startRow,1,sheet.getLastRow(),1);
var dates=dateColumn.getDisplayValues().flat();
var firstRow=dates.indexOf(startDate)+startRow;
var lastRow=日期。lastIndexOf(endDate)+startRow;
//现在获取这些行之间(包括)的范围
var range=sheet.getRange(firstRow,1,lastRow firstRow+1,sheet.getLastColumn());
var newRows=lastRow firstRow;
**如果(新行>0){
//排序和删除重复项
//您需要指定要按哪个列对数据进行排序,在本示例中为第3列—即第C列
var列=3;
排序({column:column,升序:true});
范围。移除的副本([列]);
//现在删除空行(如果有)
var deleteRows=0;//=1;i--){
if(range.getCell(i,1).isBlank()){
sheet.deleteRow(range.getCell(i,1.getRow());
deleteRows++;
}
}
//保护数据
var timeZone=Session.getScriptTimeZone();
var stringDate=Utilities.formatDate(新日期(),时区'dd/MM/yy HH:MM');
var me=Session.getEffectiveUser();
变量说明='受'+me'保护的'+stringDate+';
var height=range.getHeight();
var newHeight=高度+1;
var newRange=sheet.getRange(第一行,1,newHeight deleteRows,sheet.getLastColumn());
var protection=newRange.protect().setDescription(说明);
getCell(newHeight deleteRows,2).setValue(height deleteRows+'学生,由'+me'签名).offset(0,-1,1,6).setBackground('#e6b8af');
//protection.setDomainEdit(false);
保护。加法器(me);
protection.removeditors(protection.getEditors());
if(protection.canDomainEdit()){
protection.setDomainEdit(false);
}  
}**
}

  • 您正在检索工作表中日期出现的第一个和最后一个索引
  • 如果只有一次出现-第一个索引和最后一个索引将相同,因此
    lastRow=firstRow
    newRows=0
  • 这就是为什么
    newRows>0
    不是一个好标准的原因
  • 如果您想查询一个日期根本没有出现-请选择
    dates.indexOf(startDate)=-1
  • 如文件中所述:
indexOf()方法返回给定元素所在的第一个索引 可以在数组中找到,如果不存在,则为-1

根据您的情况进行调整:

//如果startdate出现在A列中
if(dates.indexOf(startDate)!=-1){
//排序和删除重复项
...
} 

新行是如何插入的?由人类,公式或脚本?此外,通过插入行,您是指插入包含数据的附加行还是将数据粘贴到现有的空行中?由人工完成。现在我用手动插入数据行(复制和粘贴3-4行,然后更改日期)来测试它。但通常它是由用户通过移动应用程序发送的,格式如下:日期学生ID姓名Umail Geoloc纬度Geoloc经度主题代码2020-07-08 18020061802006@icte.bdu.ac.bd25.755808 89.2412643 ICTE4215将数据广播到现有空行中。如果(newRows>0)--我认为这个条件不正确。它需要被修复。
onePeriod()e.range.getA1Notation()==='B4'
时,代码>当前才运行。这意味着,如果添加新行(因此添加的范围将不是第4行)
onePeriod()
将永远不会被调用。请注意,onEdit()表示页面名称仪表板,onePeriod表示数据输入页面。我只想检查在最后一个受保护的数据范围之后是否添加了任何新数据。如果没有,那么就不要执行突出显示的代码块。它工作正常。请检查我的另一篇文章,我必须添加另一个带有此条件的子句,也就是说,如果输入开始日期已经在受保护的数据范围内,那么它也不会执行类似的代码块。请在