Google apps script 检查Google表单中是否没有具有该ID的记录

Google apps script 检查Google表单中是否没有具有该ID的记录,google-apps-script,google-sheets,google-sheets-query,Google Apps Script,Google Sheets,Google Sheets Query,我需要通过列中的唯一Id参数通过existDataInSheet函数检查值,如果我的列表中有具有此Id的记录-我不会再次添加它,并取消函数appendDataInSheet?例如,我的代码每次添加具有相同ID的记录,但我不需要它 function saveQuery(data) { try { var lock = LockService.getPublicLock(); lock.waitLock(2000); //function to check ne

我需要通过列中的唯一Id参数通过
existDataInSheet
函数检查值,如果我的列表中有具有此Id的记录-我不会再次添加它,并取消函数
appendDataInSheet
?例如,我的代码每次添加具有相同ID的记录,但我不需要它

function saveQuery(data) {
  try {
    var lock = LockService.getPublicLock();
    lock.waitLock(2000);
    
    //function to check new Posting data
    var exist = existDataInSheet(data, 'Data');
    if (!exist) {
      data = [data];
      appendDataInSheet(data, 'Data');
    }
    
  } finally {
    lock.releaseLock();
  }
}


function existDataInSheet(data, sheetName) {  
    var cells = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getDataRange().getDisplayValues();
    var row = data.join(',');
    for (var i = 0; i < cells.length; i++) {
      var current = cells[i].join(',');
      if (row === current) {
        return true;
      }
    }
    return false;
}
函数保存查询(数据){
试一试{
var lock=LockService.getPublicLock();
洛克·韦特洛克(2000年);
//用于检查新过帐数据的函数
var exist=existDataInSheet(数据,'data');
如果(!存在){
数据=[数据];
附录数据表(数据,“数据”);
}
}最后{
锁。释放锁();
}
}
函数existDataInSheet(数据,sheetName){
变量单元格=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getDataRange().getDisplayValues();
var row=data.join(',');
对于(变量i=0;i
  • 如何在
    existDataInSheet
    函数中,每天在列表中添加一次具有两个唯一参数Id(A列)和日期(D列)的记录?例如,我添加了一条ID为
    111111
    且日期为
    27.06.2020
    的记录,之后我无法添加ID为
    111111
    且日期为的记录,但明天我可以在列表中添加ID为
    111111
    且日期为
    28.06.2020
    的新记录,以此类推
  • 答复: 一种方法是使用
    PropertiesService
    类来存储今天已经添加的记录

    更多信息: 有很多方法可以做到这一点,正如他在评论中所说的,您可以使用
    Array.prototype.indexOf()
    来检查ID是否在列中,或者如果使用V8并且您有大量数据,因此时间是一个问题,您可以使用建议的,因为这样更快

    老实说,为了避免您检查整个列,只存储您今天已经输入的ID并禁止再次输入这些ID会更快

    例如,将记录添加到工作表时,可以创建ID为的脚本属性:

    函数appendDataInSheet(){
    //这里有一些代码
    //假设使用.appendRow()输入数据:
    表.附录行([id,日期]);
    //然后保存ID:
    PropertiesService.getScriptProperties().setProperty(id,true);
    }
    
    然后,您可以检查该ID的属性是否存在:

    函数hasidebeenteredtoday(id){
    var properties=PropertiesService.getScriptProperties().getProperties;
    如果(属性[id]==true){
    返回true;
    }
    否则{
    返回false;
    }
    }
    
    然后,您可以设置一个基于时间的触发器,使其在每天午夜启动,从而清除当天准备好的所有属性:

    函数clearProperties(){
    PropertiesService.getUserProperties().deleteAllProperties();
    }
    
    设置触发器: 按照
    编辑>当前项目的触发器
    菜单项,在新打开的页面中,单击右下角的
    +添加触发器
    按钮,设置触发器设置,如下所示:

    • 选择要运行的函数:
      clearProperties
    • 选择应运行的部署:
      Head
    • 选择事件源:
      时间驱动
    • 选择基于时间的触发器类型:
      daytimer
    • 选择一天中的时间:
      午夜到凌晨1点
    然后按save

    这不会直接检查工作表以查看ID是否存在,但是因为您存储了今天存储的所有ID,所以您只需检查是否已经输入,就可以避免这种情况

    我希望这对你有帮助

    参考资料:
    其他案文:

    我会将Id列制作成一个带有映射的扁平数组,并使用索引来显示它。如果您使用的是V8引擎,您可以将范围值添加到一个集合中并检查它是否存在,这比逐个检查的
    indexOf
    要快得多。