2

This would be my first time posting, so I am sorry for the things I may or may not write.

I have a working Google Script which gets a file from an URL, parses the JSON then feed the data to a google Spreadsheet, one row at a time.

The problem that I have is that some of these files are large, 7000 rows large, which the script is unable to feed in the given time of 6 minutes. The speed of which it processes each row is quite slow, it is about 1 row every 1-3 seconds.

I believe that the problem is with the for clause, but I cannot seem to make it work. I am not that experienced with this kind of scripting, and this was made from "inspirations"

Is there a way to speed up the for process in order to fill out the sheet faster, so it wont timeout?


 SpreadsheetApp.getUi() 
     .createMenu('Update')
      .addItem('Refresh Report', 'getData')
     .addToUi();
}

function getData() {
 
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 //var sheets = ss.getSheets();
 var datasheet = ss.getSheetByName('Data');

 var hasCreatedHeaders = false;
 
 //Url
var url = 'URL HERE';

 //Create header
 var headers = {
   'Content-Type': 'application/json',
   'Authorization': 'xxx'
 };

 //Options
 var options = {
   'method': 'get',
   'headers': headers
 };

 var response = UrlFetchApp.fetch(url, options);
 var json = response.getContentText();
 var data = JSON.parse(json);
 var table = data.Table1;
 
 datasheet.clear();
 
 //foreach row
 table.forEach(function(row) {
   var cols = [];
   var headers = [];

   for (var prop in row.Columns) {
     if (!hasCreatedHeaders)
       headers.push(prop);
     
     cols.push(row.Columns[prop]);
   }
 
   if (!hasCreatedHeaders) {
    datasheet.appendRow(headers);
    hasCreatedHeaders = true;
   }
      
  datasheet.appendRow(cols);
 
 });

}

1 Answer 1

1

Try to change the loop table.forEach() this way:

//foreach row

var table_new = []; // <--- create a new empty array

table.forEach(function (row) {
    var cols = [];
    var headers = [];

    for (var prop in row.Columns) {
        if (!hasCreatedHeaders)
            headers.push(prop);

        cols.push(row.Columns[prop]);
    }

    if (!hasCreatedHeaders) {
        // datasheet.appendRow(headers);
        table_new.push(headers); // <--- add row to the array
        hasCreatedHeaders = true;
    }

    // datasheet.appendRow(cols);
    table_new.push(cols); // <--- add row to the array

});

// put the array on the sheet all at once
datasheet.getRange(1,1,table_new.length,table_new[0].length).setValues(table_new);

The problem is appendRow() method is quite time consuming. If you create the table as a 2D array you can put it on the sheet in one step with setValues() method. It's much faster.

References

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.