Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Service Error: Spreadsheets on Google Scripts

Scope

I started to write an script that will make chained calls to an API (with a JSON response) and write the result into a Spreadsheet.

What Happens:

Once i debug the script code, it runs just fine, with no major problem, but once i run it from the Spreadsheet button itself (from the menu i created) it runs some steps of the script and than, pops a : Service Error: Spreadsheet with no other error details.

Weirdness

I Started to "Log" the current step of the process to a Spreadsheet cell, so that i can monitor its progress while running the script out of the debugger.

The problem is, once i move some "random" pieces such as :

sheet.getRange("F2").setValue(currentPage);

the code tends to break in different points.

Code Sample :

You can find a code to reproduce the issue here : http://pastebin.com/HjmSwEYZ

All you have to do is :

1 - Create a new Spreadsheet on Google Drive

2 - Hit Tools -> Script Editor

3 - Create a new Script, paste the code in, and save

4 - Reload the Spreadsheet (F5) so that the custom menu will now appear "Guild Wars 2 Tracker"

5 - Click the button and hit "List All"

Desired Output:

What this code should (if it wasn't for this error) do is :

1 - Execute a request on this url : http://www.gw2spidy.com/api/v0.9/json/items/all/1 (which will return the first page of Guild Wars 2 itens)

2 - Iterates over each page, parsing the json and writing the returned values into the Spreadsheet

Disclaimer:

Sorry about all the "Log" messages in the sheet. This was a desperate attempt to track my progress, i know i should't do this.

Thanks in advance

Update 1:

After creating another Spreadsheet and pasting the pastebin code in its own Script Project i could run it for on interaction, but that was it. This time thus, it raised a different error : We're sorry, a server error occurred. Please wait a bit and try again.

like image 394
Marcello Grechi Lins Avatar asked Apr 19 '14 02:04

Marcello Grechi Lins


People also ask

Why is my Google script not working?

There are a few possible causes for these errors: A Google server or system is temporarily unavailable. Wait for a few moments and try running the script again. There is an error in your script that doesn't have a corresponding error message.


1 Answers

You can get service errors like this when you access improper ranges, and the error may not be raised until a subsequent access. For example, if you get a Range that references columns that don't exist (like H if you only have A-E), or rows that don't exist (like row 10001 when you only have 10000 rows). This is noted in the Apps Script Issue Tracker: https://issuetracker.google.com/issues/68062620

With regards to the source of your issue, your script is highly unoptimized and does not follow Apps Script "Best Practices" regarding use of the Spreadsheet Service. Namely, you should use batch operations such as Range#setValues operation to write whole blocks, or at least appendRow to append each row (instead of sheet.getRange(rowIndex, someColumn).setValue(oneValue)). These methods will add relevant rows to hold the data if they need to.

An example modification of your code:

var itemFields = [ "name",
                   "rarity",
                   "price_last_changed",
                   "max_offer_unit_price",
                   "min_sale_unit_price",
                   "offer_availability",
                   "sale_availability" ];
function addResultPage_(sheet, results) {
  const imgs = [],
  const data = results.map(function (result, index) {
    if (result.img)
      imgs.push({row: index, url: result.img});
    return itemFields.map(function (field) { return result[field] || ""; });
  });
  if (!data.length) return;

  const startRow = sheet.getLastRow() + 1;
  sheet.getRange(startRow, 2, data.length, data[0].length).setValues(data);
  if (imgs.length)
    imgs.forEach(function (imgInfo) {
      sheet.insertImage(imgInfo.url, 1, startRow + imgInfo.row);
    });
}
function listAllItems() {
  const sheet = SpreadsheetApp.getActiveSheet(),
        totalPages = updateStartStatus("List All Items");

  for (var page = 1; page <= totalPages; ++page) {
    var pageResults = getItemsByPage(page);
    if (pageResults.results)
      addResultPage_(sheet, pageResults.results);
    else
      console.warn({message: "No results for page '" + page + "'", resp: pageResults});
  }
}
like image 167
tehhowch Avatar answered Sep 18 '22 14:09

tehhowch