重复数据 google 应用脚本和上传文件 javascript

Duplicate data google apps script and javascript on upload files

我有一个带有 GAS 的网络应用程序,可以创建文件夹、上传文件、设置权限并将寄存器保存在 sheet 上。 有时,应用程序会在功能完成时复制文件并复制 google sheet 中的寄存器。我不知道如何避免这个错误,控制台也不显示错误。 会发生什么?我怎样才能避免这个问题?

这是我的服务器端函数代码:

function fileExists(idfileexist,folderId) {

var consulta = DriveApp.getFileById(idfileexist).getName()

  var files = DriveApp.getFilesByName(consulta);
  while (files.hasNext()) {
    var file = files.next();
    var folders = file.getParents();
    if (folders.hasNext()) {
      var folder = folders.next();
      if (folder.getId() == folderId) {
        
        return true;
        
      }
    }
  }
  
  return false;
}

function removepermission(id, user){
DriveApp.getFileById(id).removeEditor(user)
}
function appendrow(idfile,sheet,numsip,rut,timestamp,user,idfolder,input,ticket){

var values = SpreadsheetApp.openById(idfile);
var ss= values.getSheetByName(sheet);
ss.appendRow([numsip,rut,timestamp,user,idfolder,input,ticket])

}

function setpermisoswriter(id,array){

var file = DriveApp.getFileById(id)
var editors = file.getEditors();
if (editors.length > 0) {
  for (var i = 0; i < array.length; i++) {
    Drive.Permissions.insert({'role': 'writer','type': 'user','value': array[i]},id,{'sendNotificationEmails': 'false' });};};
}
function setpermisosreader(id,array){
var file = DriveApp.getFileById(id)
var editors = file.getEditors();
if (editors.length > 0) {
  for (var i = 0; i < array.length; i++) {
    Drive.Permissions.insert({'role': 'reader','type': 'user','value': array[i]},id,{'sendNotificationEmails': 'false' });};};
}
function setownerid(id,user){
Drive.Permissions.insert({'role': 'owner','type': 'user','value': user},id,{'sendNotificationEmails': 'false'})
}
function setpermisoread(id,user){
    Drive.Permissions.insert({'role': 'reader','type': 'user','value': user},id,{'sendNotificationEmails': 'false'})
}
function setpermisowrite(id,user){
    Drive.Permissions.insert({'role': 'writer','type': 'user','value': user},id,{'sendNotificationEmails': 'false' })
}

function permissionstotal(){

  var parentFolderId = "parentFolderId";
  var idfilesheet="idfilesheet";
  var useractive = Session.getActiveUser().getEmail();
  var jefes = ["EMAIL@EMAIL.COM","EMAIL@EMAIL.COM", "EMAIL@EMAIL.COM","EMAIL@EMAIL.COM"]
  var userviewer="EMAIL@EMAIL.COM"
  
  setpermisosreader(parentFolderId,jefes)
  setpermisosreader(idfilesheet,jefes)
  setpermisoread(idfilesheet,useractive)
  removepermission(parentFolderId,useractive)
  setpermisoread(parentFolderId, useractive)
  //setpermisowrite(idfilesheet,userviewer)
  
  //setpermisoread(parentFolderId,userviewer)
}

function addNewRow(array,obj) {

  var admin ="ADMIN"
  var useractive = Session.getActiveUser().getEmail();
  var timestamp = new Date();
  var sheet="DATA"
  var jefes = ["EMAIL@EMAIL.COM","EMAIL@EMAIL.COM", "EMAIL@EMAIL.COM","EMAIL@EMAIL.COM"]
  var userviewer="EMAIL@EMAIL.COM"
  var parentFolderId = "parentFolderId";
  var idfile="idfile"
  var parentFolder = DriveApp.getFolderById(parentFolderId);
  setpermisowrite(parentFolderId,useractive)
  setpermisowrite(idfile,useractive)
  var folderName = "SIP "+array.numsip+"/"+array.rut;
  var foldercreated = parentFolder.getFoldersByName(folderName);
  foldercreated = foldercreated.hasNext() ? foldercreated.next() : parentFolder.createFolder(folderName);
  var idfolder= foldercreated.getId()
  appendrow(idfile,sheet,array.numsip,array.rut,timestamp,useractive,idfolder,array.input,array.ticket)
  setownerid(idfolder,admin)
  setpermisosreader(idfolder,jefes)
  //setpermisoread(idfolder,userviewer)
  
  return obj.map(({fileName, mimeType, data}) => {
  var blob = Utilities.newBlob(Utilities.base64Decode(data), mimeType, fileName);
  var foldercode = foldercreated.createFile(blob).getId();
  var archivo = fileExists(foldercode,idfolder);
  if (archivo==false){
    
    console.log("archivo ya existe")
     
  }
  else{

  setpermisosreader(foldercode,jefes)
  //setpermisoread(foldercode,userviewer)
  setownerid(foldercode,admin)
  removepermission(foldercode,useractive)
  setpermisoread(foldercode,useractive)
  removepermission(idfolder,useractive)
  setpermisoread(idfolder,useractive)
  console.log("archivo creado")

 return foldercode
    
  }
  
  });
  
}

function getsip(sipCode){
 //var sipCode= "123"
  var url ="URL SHEET";
  var ss2= SpreadsheetApp.openByUrl(url);
  var ws2= ss2.getSheetByName("DATA")
  var data2 = ws2.getRange(2, 1, ws2.getLastRow(), 2).getDisplayValues()
  var idList = data2.map(function(r) {return r[0];});
  
  var position = idList.indexOf(sipCode)
  if (position >-1){
    console.log (idList[position])
    return "REPETIDO";
     
  } else{
    console.log ("2")
  return "NOREPETIDO"
    }
}

这是 Javascript 代码:

function enviardatosvalidados(){

  var validacion=document.getElementById("sipcode").value

if(validacion=="REPETIDO"){
 
  $('#modal2').modal('hide')
  $('#modalval').modal('show')
  }
else{
  
  try{

enviardatos()
$("#generar").attr("disabled", true)
google.script.run.permissionstotal()
setTimeout(function(){ 
    
  $("#generar").attr("disabled", false)  ; }, 25000)
  window.reloadTheWebApp = function() {
    console.log('reloadTheWebApp ran');

    var linkTag = document.getElementById('testLink');

    linkTag.click();
  }

  }  catch(error){
    alert("Hubo un error.")
    alert(error)

  }
  
}

}
  function enviardatos(){
     if(validate()){

  var sip = document.getElementById("numsip")
  var rut = document.getElementById("rut")
  var input = document.getElementById("input") 
  var ticket = document.getElementById("ticket") 
  var array ={numsip: sip.value,rut: rut.value, input:input.value,ticket:ticket.value}
  const f = document.getElementById('files');

Promise.all([...f.files].map((file, i) => {
  const fr = new FileReader();
  return new Promise((r, rj) => {
    fr.onload = (e) => {
      const data = e.target.result.split(",");
      r({fileName: f.files[i].name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]});
    }
    fr.onerror = (e) => rj(e);
    fr.readAsDataURL(file);
  });
}))
.then(obj => google.script.run.withSuccessHandler(console.log).addNewRow(array, obj))
.catch(err => alert(err));
$('#modal2').modal('hide')

successnotification2()
  setTimeout(function(){ 
    
    $(':input').val('');
    
    $("#modalcarpeta").modal('show'); }, 25000);
    ;
  
  }
  else{
    $('#modal2').modal('hide')
    
  }
  }

  function validate(){
  var fieldsToValidate = document.querySelectorAll("#userform input, #userform select");
  Array.prototype.forEach.call(fieldsToValidate, function(el){
  if(el.checkValidity()){
  el.classList.remove("is-invalid");
  
  }else{
  el.classList.add("is-invalid");
     
  }
       
  });
  
  return Array.prototype.every.call(fieldsToValidate, function(el){
  return el.checkValidity();
    
  });
      
   } 

  function checkRut(rut) {
    // Despejar Puntos
    var valor = rut.value.replace('.','');
    // Despejar Guión
    valor = valor.replace('-','');
    
    // Aislar Cuerpo y Dígito Verificador
    cuerpo = valor.slice(0,-1);
    dv = valor.slice(-1).toUpperCase();
    
    // Formatear RUN
    rut.value = cuerpo + '-'+ dv
    
    // Si no cumple con el mínimo ej. (n.nnn.nnn)
    if(cuerpo.length < 7) { rut.setCustomValidity("RUT Incompleto"); return false;}
    
    // Calcular Dígito Verificador
    suma = 0;
    multiplo = 2;
    
    // Para cada dígito del Cuerpo
    for(i=1;i<=cuerpo.length;i++) {
    
        // Obtener su Producto con el Múltiplo Correspondiente
        index = multiplo * valor.charAt(cuerpo.length - i);
        
        // Sumar al Contador General
        suma = suma + index;
        
        // Consolidar Múltiplo dentro del rango [2,7]
        if(multiplo < 7) { multiplo = multiplo + 1; } else { multiplo = 2; }
  
    }
    
    // Calcular Dígito Verificador en base al Módulo 11
    dvEsperado = 11 - (suma % 11);
    
    // Casos Especiales (0 y K)
    dv = (dv == 'K')?10:dv;
    dv = (dv == 0)?11:dv;
    
    // Validar DV
    if(dvEsperado != dv) { rut.setCustomValidity("RUT Inválido"); return false; }
    
    // Validación
    rut.setCustomValidity('');
}
function successnotification2(){
  
  document.getElementById("save-success2").classList.remove("invisible");
  setTimeout(function(){
    document.getElementById("save-success2").classList.add("invisible")  
    },25000);
       }

  function getSip(){
   
    var sipCode = document.getElementById("numsip").value;
   
   google.script.run.withSuccessHandler(updatesipcode).getsip(sipCode);
    
   }
   
   function updatesipcode(sipCode){
   document.getElementById("sipcode").value = sipCode;
   
   
   }

document.getElementById("numsip").addEventListener("input",getSip)

您好,谢谢!

我的旧方法很“重”。当我设置文件夹和文件的权限时,我不得不多次调用驱动程序 API 和服务。另一个问题是父文件夹有很多文件夹和很多文件,这使得设置用户权限或撤销权限需要很长时间。 我的新方法是为用户创建一个具有编辑权限的文件夹,并将文件和文件夹移动到其他用户的命运文件夹。我的目标是为最终 users.This 设置正确的权限是我的新代码。 javascript的代码没有问题:

function moveFiles(sourceFileId, targetFolderId) {
  var file = DriveApp.getFileById(sourceFileId);
  file.getParents().next().removeFile(file);
  DriveApp.getFolderById(targetFolderId).addFile(file);
}

function fileExists(idfileexist,folderId) {
var consulta = DriveApp.getFileById(idfileexist).getName()
  var files = DriveApp.getFilesByName(consulta);
  while (files.hasNext()) {
    var file = files.next();
    var folders = file.getParents();
    if (folders.hasNext()) {
      var folder = folders.next();
      if (folder.getId() == folderId) {
        return true;
      }
    }
  }
  
  return false;
}

function removepermission(id, user){
DriveApp.getFileById(id).removeEditor(user)
}
function appendrow(idfile,sheet,numsip,rut,timestamp,user,idfolder,exedoc,ticket){

var values = SpreadsheetApp.openById(idfile);
var ss= values.getSheetByName(sheet);
ss.appendRow([numsip,rut,timestamp,user,idfolder,exedoc,ticket])
}
function setpermisoswriter(id,array){

var file = DriveApp.getFileById(id)
var editors = file.getEditors();
if (editors.length > 0) {
  for (var i = 0; i < array.length; i++) {
    Drive.Permissions.insert({'role': 'writer','type': 'user','value': array[i]},id,{'sendNotificationEmails': 'false' });};};
}
function setpermisosreader(id,array){
var file = DriveApp.getFileById(id)
var editors = file.getEditors();
if (editors.length > 0) {
  for (var i = 0; i < array.length; i++) {
    Drive.Permissions.insert({'role': 'reader','type': 'user','value': array[i]},id,{'sendNotificationEmails': 'false' });};};
}
function setownerid(id,user){
Drive.Permissions.insert({'role': 'owner','type': 'user','value': user},id,{'sendNotificationEmails': 'false'})
}
function setpermisoread(id,user){
    Drive.Permissions.insert({'role': 'reader','type': 'user','value': user},id,{'sendNotificationEmails': 'false'})
}
function setpermisowrite(id,user){
    Drive.Permissions.insert({'role': 'writer','type': 'user','value': user},id,{'sendNotificationEmails': 'false' })
}

function addNewRow(array,obj) {
  var admin ="ADMIN"
  var useractive = Session.getActiveUser().getEmail();
  var timestamp = new Date();
  var sheet="DATA"
  var parentFolderIdorigen ="PARENT FOLDER"
  var idfile="IDSHEET"
  var parentFolderorigen = DriveApp.getFolderById(parentFolderIdorigen)
  var parentFolderIddestino = "ID"
  setpermisowrite(idfile,useractive)
  var folderName = "SIP "+array.numsip+"/"+array.rut;
  var foldercreated = parentFolderorigen.getFoldersByName(folderName);
  foldercreated = foldercreated.hasNext() ? foldercreated.next() : parentFolderorigen.createFolder(folderName);
  var idfolder= foldercreated.getId()
  appendrow(idfile,sheet,array.numsip,array.rut,timestamp,useractive,idfolder,array.input,array.ticket)
  setownerid(idfolder,admin)
  return obj.map(({fileName, mimeType, data}) => {
  var blob = Utilities.newBlob(Utilities.base64Decode(data), mimeType, fileName);
  var foldercode = foldercreated.createFile(blob).getId();
  var archivo = fileExists(foldercode,idfolder);
  if (archivo==false){
      
    console.log("archivo ya existe")
     
  }
  else{
    setownerid(foldercode,admin)
    
  moveFiles(idfolder,parentFolderIddestino)
  moveFiles(foldercode,idfolder)
  console.log("archivo creado")
 return foldercode
    
  }
  
  });
  
}

function getsip(sipCode){
 
  var url ="URLSHEET";
  var ss2= SpreadsheetApp.openByUrl(url);
  var ws2= ss2.getSheetByName("DATA")
  var data2 = ws2.getRange(2, 1, ws2.getLastRow(), 2).getDisplayValues()
  var idList = data2.map(function(r) {return r[0];});
  
  var position = idList.indexOf(sipCode)
  if (position >-1){
    console.log (idList[position])
    return "REPETIDO";
     
  } else{
    console.log ("2")
  return "NOREPETIDO"
    }
}

感谢@Cooper 和@ziganotschka 的评论。