Mam mały projekt, który czytał z arkusza danych głównych. Gdy użytkownik umieścił swój numer w arkuszu wyszukiwania. Nowy arkusz z utworzonym tym numerem. Chcę, aby ten arkusz został usunięty po pewnym czasie, a dalej 5 minut. BTW, inny arkusz użytkownika może być utworzony w dowolnym momencie, więc chcę, aby kod usunąć odpowiednio arkusz każdego użytkownika.

Może być kolejne rozwiązanie do usunięcia wszystkich utworzonych arkuszy z wyjątkiem pierwszych dwóch arkuszy (arkusz danych i arkusz wyszukiwania)

Czy ktoś może pomóc na tym kodzie plz.

function onEdit(e) 
{      

    var source = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = source.getSheetByName('Search');
    var val = sheet.getRange('A2').getValue();
    sheet.copyTo(source).setName(val);


  if (e.range.getSheet().getName() === 'Search') 
  {
    if (e.range.getA1Notation() === 'A2') 
    {

      SpreadsheetApp
      .getActiveSpreadsheet()
      .getSheetByName('Search')
      .getRange('B2')
      .setValue('=QUERY(Data!A2:M,"Select * WHERE H ="""&A2&"""")')
                  
                  Utilities.sleep(10000);
                  var ss = SpreadsheetApp.getActive();
                  var sheet2 = ss.getSheetByName(val);
                  //sheet2.activate();
                      ss.deleteSheet(sheet2);
                        SpreadsheetApp.flush();
    
    }
  }
}
0
Andous 20 październik 2020, 17:06

1 odpowiedź

Najlepsza odpowiedź

Kiedyś po utworzeniu nowego arkusza, możesz Utwórz wyzwalacz, aby go usunąć po 5 minutach.

function onEdit(e) {
  // ...
  var userSheet = sheet.copyTo(source).setName(val);
  // ...
  createDeletionTrigger_(userSheet);
  // ...
}

/**
 * Create a trigger to delete the specified sheet after a set amount of time.
 * @param {Sheet} sheet - The sheet to be deleted.
 */
function createDeletionTrigger_(sheet) {
  DeletionQueue.append(sheet.getSheetId());
  ScriptApp.newTrigger('deleteNextUserSheet').timeBased().after(5 * 1000).create();
}

/**
 * Delete the next sheet in the user's queue and the delete the calling trigger.
 */
function deleteNextUserSheet(e) {
  DeletionQueue.deleteNext();
  deleteTrigger(e.triggerUid);
}

/**
 * Find a trigger by its unique ID and delete it.
 * @param {string} triggerUid - The trigger's unique ID.
 */
function deleteTrigger(triggerUid) {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    var trigger = triggers[i];
    if (trigger.getUniqueId() === triggerUid) {
      ScriptApp.deleteTrigger(trigger);
      break;
    }
  }
}

/**
 * The queue of IDs for sheets that should be deleted. 
 */
var DeletionQueue = {
  key: 'deletionQueue',
  cache: CacheService.getUserCache(),
  
  /**
   * Get the queue of sheet IDs in the order they were added.
   * @returns {number[]}
   */
  get: function() {
    var queue = this.cache.get(this.key);
    return queue == null ? [] : JSON.parse(queue);
  },
  
  /**
   * Append a new sheet ID to the queue for future deletion.
   * @param {number} sheetId - The new sheet ID to append.
   */
  append: function(sheetId) {
    var queue = this.get();
    queue.push(sheetId);
    this.update(queue);
  },
  
  /**
   * Replace the cached queue with a new array of sheet IDs.
   * @param {number[]} queue - The new array of sheet IDs.
   */
  update: function(sheetIds) {
    this.cache.put(this.key, JSON.stringify(sheetIds));
  },
  
  /**
   * Delete the next sheet (FIFO) and update the cached queue.
   */
  deleteNext: function() {
    var queue = this.get();
    var sheetId = queue.shift();
    var spreadsheet = SpreadsheetApp.getActive();
    var sheets = spreadsheet.getSheets();
    for (var i in sheets) {
      var sheet = sheets[i];
      if (sheet.getSheetId() === sheetId) {
        spreadsheet.deleteSheet(sheet);
        this.update(queue);
        break;
      }
    }
  }
}

Nie możesz przekazać wartości do wyzwalacza, więc musisz gdzieś uratować arkusz. Używam Cache Cache, aby zapisać identyfikatory arkusze, ponieważ IDS nie mogą się zmienić, Ale nazwy arkuszy mogą. (Należy pamiętać, że pamięć podręczna domyślna do 10-minutowego wygaśnięcia, więc musisz dostosować kod, jeśli chcesz, aby identyfikatorów przeliczały dłużej niż to.) W szczególności, używam Użytkownik cache, więc różni użytkownicy nie usunie nawzajem swoje arkusze.

Ponieważ jest to kolejka, ten sam użytkownika powinien być w stanie utworzyć wiele arkuszy i one powinny być poprawnie usunięte w kolejności, w jakiej zostały utworzone.

Jest Cytat z 20 wyzwalaczy / Użytkownika / Skryptu i Maddeny , ma zastosowanie do wyzwalaczy "niepełnosprawnych". Chcesz więc usunąć wyzwalacz po jej użyciu, który można osiągnąć za pomocą triggerUid przeszedł przez jego Obiekt zdarzenia.

2
Diego 20 październik 2020, 22:30