Google Apps Script - две функции / скрипты работают, когда запускаются отдельно, но не вместе - PullRequest
2 голосов
/ 30 января 2020

Я работаю над сценарием, который обновляет значения файла XLS. Я только добавлю то, что считаю относящимся к проблеме, но скажите, если вам нужна дополнительная информация.

Сначала я отправляю форму, в которой указано, какие значения добавить, где добавить и сколько. Затем скрипт запускается при отправке формы.

Сначала он преобразует файл .XLS в файл .CSV, а затем добавляет данные из файла CSV в электронную таблицу Google, а также добавляет значения, где я Сказал, чтобы все было в порядке. Все это работает нормально, я вижу, что значения обновляются в Google Sheet каждый раз, когда это происходит и после запуска кода.

После того, как я закончу, я хочу преобразовать Google Sheet обратно в файл XLS и поместите его обратно в папку, где он был изначально. В первый раз, когда я делаю это, значения обновляются в файле XLS, но во второй раз и каждый раз после этого он «отстает на одну сессию». Во второй раз я не получаю обновленные значения в новом файле XLS, в третий раз я получаю обновленные значения со второго раза и далее. Это происходит только с файлом XLS, а не с Google Sheet.

Это происходит только тогда, когда код / ​​функция, которая экспортирует файл XLS, запускается мной вручную, все работает правильно. Но если я добавлю эту функцию после основного кода, проблема произойдет.

И я пытался приостановить код на 10 секунд между функциями, но получаю тот же результат.


Поскольку все добавляемые значения работают правильно на листе Google Я просто добавлю код преобразования типов файлов. Я просто прокомментирую, что происходит между ними с //

Вот только функция, которая запускается одновременно, но не дает мне файл XLS с последними обновленными значениями:

function test() {    

  newValuesToDatabase();
  updateALLITEMS();

}

Функция, которая добавляет новые значения (как в другую нерелевантную электронную таблицу, так и в электронную таблицу, которая станет файлом XLS)

function newValuesToDatabase() {


// FIRST FINDS OUT WHAT TO UPDATE FROM THE FORM SHEET 
// Ends up with "formX" array seen later in the code


// Opens and gets the data from another sheet I also want to update (Irrelevant sheet) 
// This ends up with the "itemDataBase" Array used later


// Gets the XLS file and turn it into CSV


    var workFolder = DriveApp.getFolderById( "(workFolderid)" ),
        backupFolder = DriveApp.getFolderById( "(backupFolderid)" );

    var oauthToken = ScriptApp.getOAuthToken(),
        sourceFolder = DriveApp.getFolderById( "(sourceFolderid)" ),
        mimes = [MimeType.MICROSOFT_EXCEL, MimeType.MICROSOFT_EXCEL_LEGACY];



    for (var m = 0; m < mimes.length; m++) {

      var files = sourceFolder.getFilesByType(mimes[m]);

        while (files.hasNext()) {

          var sourceFile = files.next();

          if (sourceFile.getName() == "ALL ITEMS") {

            console.log("File found")


            //Creates a backupfile to be put in a different folder
            var backupDate = (new Date).getDate() + ", " 
                           + (new Date).toString().split(" ")[1] + " " 
                           + (new Date).getYear();

            sourceFile.makeCopy(backupFolder).setName("backup on " + backupDate);
            sourceFile.setTrashed(true);


            var googleSheet = JSON.parse(UrlFetchApp.fetch(
                "https://www.googleapis.com/upload/drive/v2/files?uploadType=media&convert=true", {
                    method: "POST",
                    contentType: "application/vnd.ms-excel",
                    payload: sourceFile.getBlob().getBytes(),
                    headers: {
                        "Authorization": "Bearer " + oauthToken
                    }
                }
            ).getContentText());   


            // The exportLinks object has a link to the converted CSV file
            var targetFile = UrlFetchApp.fetch(
                googleSheet.exportLinks["text/csv"], {
                    method: "GET",
                    headers: {
                        "Authorization": "Bearer " + oauthToken
                    }
                });

            // Save the CSV file in a folder to be deleted in the end of the script when done with it
            var csvFile = workFolder.createFile(targetFile.getBlob()).setName(sourceFile.getName() + ".csv");

          }
        }
      } 





    // Finds the google sheet that later will be converted back to XLS:


     var checkSSFile = workFolder.getFilesByName("Update Items (ikke rør)");
     var checkID = checkSSFile.next().getId().toString();

     var addSpreadSheet = SpreadsheetApp.openById(checkID),
         addSheet = addSpreadSheet.getSheetByName("ALL ITEMS");



     // Gets the CSV file and makes an array from it

     var csvFile = workFolder.getFilesByType(MimeType.CSV).next();

     if (csvFile.getName() == "ALL ITEMS.csv") {

       var csvData = Utilities.parseCsv(csvFile.getBlob().getDataAsString());

     }



     function updateAmount() {  // ( This function is ran at the bottom of code )



       //Code first adds stuff to the irrelevant spreadsheet mentioned in the beginning of this code



       // Then gets the sheet that will be converted to XLS:

         var range = addSheet.getRange(1, 1, addSheet.getLastRow()+1, 2);
         range.clearContent(); //Empties sheet first so there are no overlap when adding everything over again


         //Code then adds the old and new values into that sheet in the right order and way

     }




   // Here is where the code is ran dependent on what the form says.


     if (formX[0][1] == "Add a new item of something we have from before") {

       updateAmount();

     } else if (formX[0][1] == "Add a completely new item") {

       //I have not added this function/code yet

     } else {

       console.log("Could not find a mode in the form submission");

     }


     csvFile.setTrashed(true); //Then trashes the csv file in the end
}

Затем функция, которая преобразует ее обратно и помещает ее в правую место:

function updateALLITEMS() {

  var workFolder = DriveApp.getFolderById( "(workFolderid)" );
  var checkSS = workFolder.getFilesByName("Update Items (ikke rør)");
  var checkID = checkSS.next().getId().toString();

  var sourceFolder  = DriveApp.getFolderById( "(sourceFolderid)" ),
      file          = DriveApp.getFileById(checkID),
      url           = 'https://docs.google.com/spreadsheets/d/'+checkID+'/export?format=xlsx';
  var token         = ScriptApp.getOAuthToken();

  var newAllItems      = UrlFetchApp.fetch(url, {
    method: "GET",
    payload: file.getBlob().getBytes(),
    headers: {
        'Authorization': 'Bearer ' +  token
      }
  });


  // Then add "ALL ITEMS" XLS file back to where it was
  sourceFolder.createFile(newAllItems.getBlob()).setName("ALL ITEMS"); 


   //This deletes files that appear on the main GDrive folder, don't know why. 
   //These files are named "Unknown", and are copies of the Google Sheet I'm working on

  var ss = DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS); 
  while (ss.hasNext()) {
    var sht = ss.next();
    if (sht.getName() == "Untitled") {

      var shtID = sht.getId();
      var checkSht1 = SpreadsheetApp.openById(shtID).getSheets();
      if ( checkSht1.length == 1 ) { 

        if (checkSht1[0].getRange(1, 1).getValue() == "BARCODE") {

          sht.setTrashed(true);


        }
      }
    }
  }
}

Большое спасибо за то, что прочитали все это, я застрял с этим слишком долго. Я пробовал много разных вещей, но всегда получал один и тот же результат (если только я вручную не запускаю одно, затем другое, когда первое сделано). Надеюсь, код не слишком запутанный, я новичок в кодировании:)

1 Ответ

1 голос
/ 30 января 2020

Вы пробовали SpreadsheetApp.flu sh в конце первой функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...