脚本仅在由另一个脚本执行时给出错误

Script gives Error only when executed by another script

你好我想知道是什么导致了这个问题,如果我执行这两个函数,其中一个似乎已经完成了。但奇怪的是,它在 9/10 的情况下完成了工作。所以即使它完成了它也会带来错误。这是错误消息:“文档 ************* 丢失(可能已被删除,或者您没有读取权限?)”我在想,因为我删除了一个文件,也许我这样做了太早了,这导致了错误,但即使暂停了 30 秒,它也没有改变任何事情。希望有人知道是什么导致了错误以及为什么它在大多数情况下有效但并非总是如此(在 1/10 的情况下,我从 Excel 创建的电子表格之一仍在目标文件夹中)。

提前致谢:)

函数号1:

function insertFunction() {
  // ID of source folder
  var sourceFolderId = "18ZQnfIjio2MvqfkCuF8kTKL5sukN1Txn"; 
 
  // ID of destination folder
  var destinationFolderId = "1AWz_tQa0le5EHTstQvpLNBBvl9z0kGxp"; 
 
  // Get Microsoft Excel spreadsheet file
  var files = DriveApp.getFolderById(sourceFolderId).getFilesByName("Kapazitäten Linien 2020_DOMAP.xlsm").next();
    var name = files.getName().split('.')[0]; 
    var blob = files.getBlob();
 
    var newFile = {
        title : name + '_converted',
        parents: [{id: destinationFolderId}] 
      }; 
    
    var sheetFile = Drive.Files.insert(newFile, blob, { convert: true });
    var newID = sheetFile.getId();
  Utilities.sleep(30000);
  Drive.Files.trash(newID);
  Drive.Files.emptyTrash();
  //start nächste Funktion
  insert2Function();
}

1号函数执行的2号函数:

  function insert2Function() {
  // ID of source folder
  var sourceFolderId = "1fOsBuKL9Q9832lue596tWFWCUBxo5f_g"; 
 
  // ID of destination folder
  var destinationFolderId = "1AWz_tQa0le5EHTstQvpLNBBvl9z0kGxp"; 
 
  // Get Microsoft Excel spreadsheet files
  var files = DriveApp.getFolderById(sourceFolderId).getFilesByName("Kapazitäten Linien 2021_DOMAP.xlsm").next();
    var name = files.getName().split('.')[0]; 
    var id = files.getId();
    var blob = files.getBlob();
 
    var newFile = {
        title : name + '_converted',
        parents: [{id: destinationFolderId}] 
      }; 
    
    var sheetFile = Drive.Files.insert(newFile, blob, { convert: true });
    var newID2 = sheetFile.getId();
  Utilities.sleep(30000);
  Drive.Files.trash(newID2);
  Drive.Files.emptyTrash();
}

我删除的计算: 第一名:

//Berechnungen
  var forecast = SpreadsheetApp.openById(newID).getSheetByName("Übersicht").getRange(15,5,1,1).getValue();
  var jahresmenge = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(5,3,1,1);
  jahresmenge.setValue(forecast);
  var bereitsGenutzeKapazitaet = SpreadsheetApp.openById("1bInkjzCfV4pnThjknZ5xnG-p52oUEeSw4MAGwxmgO-U").getSheetByName("Auswertung").getRange(8,8,1,1).getValue();

第 2 位:

var berechnungAktMenge = SpreadsheetApp.openById(newID2).getSheetByName("Linie 4").getRange(28,3,1,1).setValue("=SUMIF(Query!$K:$K83;'Linie 4'!A28;Query!$G:$G83)");
  var berechnungOee = SpreadsheetApp.openById(newID2).getSheetByName("Übersicht").getRange(41,5,1,1).setValue("=E23/(((E9-E31)*480)*E3)");
  var aktMenge = SpreadsheetApp.openById(newID2).getSheetByName("Linie 4").getRange(18,48,1,1).getValue();
  var aktMengeAktualisiert = SpreadsheetApp.openById(newID2).getSheetByName("Übersicht").getRange(23,5,1,1);
  aktMengeAktualisiert.setValue(aktMenge);
  var bisherProd = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(5,3,1,1);
  bisherProd.setValue(aktMenge);
  var jahresmenge = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(5,2,1,1).getValue();
  var nochZuProduzieren = jahresmenge - aktMenge;
  var anzeigeNochZuProduzieren = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(5,4,1,1);
  anzeigeNochZuProduzieren.setValue(nochZuProduzieren);
  var kapazitaeten2021 = SpreadsheetApp.openById(newID2).getSheetByName("Linie 4").getRange(4,48,1,1).getValue();
  var schichtenNochVerfuegbar = SpreadsheetApp.openById(newID2).getSheetByName("Linie 4").getRange(24,48,1,1).getValue();
  var anzeigeKapazitaeten = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(8,2,1,1);
  anzeigeKapazitaeten.setValue(kapazitaeten2021);
  var kapazitaetNochVerfuegbar = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(8,4,1,1);
  kapazitaetNochVerfuegbar.setValue(schichtenNochVerfuegbar);
  var anzeigeKapazitaetGebraucht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(8,3,1,1);
  anzeigeKapazitaetGebraucht.setValue(kapazitaeten2021-schichtenNochVerfuegbar);
  var ueberschuessig2021 = schichtenNochVerfuegbar-(nochZuProduzieren/(aktMenge/(kapazitaeten2021-schichtenNochVerfuegbar)));
  ueberschuessig2021 = ueberschuessig2021.toFixed(0);
  var anzeigeUeberschuss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(8,5,1,1);
  anzeigeUeberschuss.setValue(ueberschuessig2021);
  var jahresschnitt = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jahresmenge").getRange(11,3,1,1);
  jahresschnitt.setValue(aktMenge/(kapazitaeten2021-schichtenNochVerfuegbar));

我不知道这些函数在做什么?看起来他们转换了原始文件,将其保存到折叠的目标位置,并在 30 秒后删除了这个新文件。 'it does the job in like 9/10 cases' 是什么意思?据我所知,这份工作几乎立即被删除了。

您是要删除原始文件吗?不是新的吗?如果是这样,您需要这样更改最后几行:

files.setTrashed(); // it removes old original file in source folder

// instead of this
// var newID = sheetFile.getId(); // here you get the new file ID
// Utilities.sleep(30000);        // wait 30 sec.
// Drive.Files.trash(newID);      // and delete the new file
// Drive.Files.emptyTrash();      // and even cover your tracks!

尝试添加

SpreadsheetApp.flush();

删除电子表格之前。

参考: