2017-01-26 8 views
1

So habe ich ein Skript das bekommt einige Daten von einem Server.
Ich möchte mein Skript die Daten auf einen Blattnamen "Marktartikel" veröffentlichen.
Ich habe das funktioniert, wenn ich das Skript direkt aus dem Blatt mit =getMarketItemsTrigger(1) ausführen.
Es postet alle 11.669 Artikel zu meinem Blatt.Google Blatt Skript Einfügen von Daten in Blatt

Das Problem dabei ist, dass es jedes Mal aktualisiert wird, wenn das Blatt neu geladen wird; Ich brauche es nur einmal im Monat zu laufen.
Ich habe versucht, ein Skript zu erstellen, das keine Referenz in dem angegebenen Blatt benötigt, sondern direkt an ein vorbenanntes Blatt sendet, aber ich kann nicht herausfinden, wie ich die Daten in das Blatt

bekommen kann die Skriptdatei i

var version = '9a' 
 
function getMarketItemsTrigger(refresh) 
 
{ 
 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
 
    var sheet = ss.getSheetByName("Market Items"); 
 
    
 
    Logger.log(sheet.getMaxColumns()); 
 
    Logger.log(sheet.getMaxRows()); 
 
    sheet.clear(); 
 
    
 
    
 
    if(sheet.getMaxColumns()>2){ 
 
    Logger.log('deleting colums'); 
 
    sheet.deleteColumns(2, sheet.getMaxColumns()-2); 
 
    
 
    } 
 
    if(sheet.getMaxRows()>2){ 
 
    Logger.log('deleting rows'); 
 
    sheet.deleteRows(2,sheet.getMaxRows()-1); 
 
    } 
 
    
 
    var marketItemsEndpoint = 'https://crest-tq.eveonline.com/market/types/'; 
 
    var marketItemsResponse = JSON.parse(fetchUrl(marketItemsEndpoint)); 
 

 
    var totalPages = marketItemsResponse['pageCount']; 
 

 
    var itemList = []; 
 
    var headers = ['Item Name', 'ID']; 
 
    itemList.push(headers); 
 

 
    
 
    for (var currentPage = 1; currentPage <= totalPages; currentPage++) 
 
    { 
 
    Logger.log('Processing page ' + currentPage); 
 
    var marketItems = marketItemsResponse['items']; 
 
    for (var itemReference in marketItems) 
 
    { 
 
     var item = marketItems[itemReference]; 
 
     itemList.push([item['type']['name'], item['id']]); 
 
     
 
     
 
    } 
 

 
    if (currentPage < totalPages) 
 
    { 
 
     var nextEndpoint = marketItemsResponse['next']['href']; 
 
     marketItemsResponse = JSON.parse(fetchUrl(nextEndpoint)); 
 
    } 
 
    
 
    
 
    
 
    } 
 
    
 
    //sheet.insertRows(1,itemList.length+1); 
 
// var range = sheet.getRange(1, 1,itemList.length+1,3); 
 
    
 
// for(var i = 1;i<itemList.length;i++){ 
 
    
 
// range.getCell(i, 1).setValue([itemList]); 
 
// range.getCell(1, i).setValue(itemList.); 
 
    // } 
 
// Logger.log("don"); 
 
//sheet.getRange(1, 1, 1, itemList.length).setValues(itemList); 
 
    
 
// sheet.getRange(itemList.length+1, 2).setValues(itemList); 
 
// sheet.getDataRange().setValues([itemList]); 
 
// sheet.appendRow(itemList); 
 
// sheet.getRange(12+totalPages, 1, itemList.length, 1).setValues(itemList); 
 
    return itemList; 
 
} 
 
/** 
 
* Private helper method that wraps the UrlFetchApp in a semaphore 
 
* to prevent service overload. 
 
* 
 
* @param {url} url The URL to contact 
 
* @param {options} options The fetch options to utilize in the request 
 
*/ 
 
function fetchUrl(url) 
 
{ 
 
    if (gcsGetLock()) 
 
    { 
 
    // Make the service call 
 
    headers = {"User-Agent": "Google Crest Script version " + version + " (/u/nuadi @Reddit.com)"} 
 
    params = {"headers": headers} 
 
    httpResponse = UrlFetchApp.fetch(url, params); 
 
    } 
 
    
 
    return httpResponse; 
 
} 
 

 

 
/** 
 
* Custom implementation of a semaphore after LockService failed to support GCS properly. 
 
* Hopefully this works a bit longer... 
 
* 
 
* This function searches through N semaphores, until it finds one that is not defined. 
 
* Once it finds one, that n-th semaphore is set to TRUE and the function returns. 
 
* If no semaphore is open, the function sleeps 0.1 seconds before trying again. 
 
*/ 
 
function gcsGetLock() 
 
{ 
 
    var NLocks = 150; 
 
    var lock = false; 
 
    while (!lock) 
 
    { 
 
    for (var nLock = 0; nLock < NLocks; nLock++) 
 
    { 
 
     if (CacheService.getDocumentCache().get('GCSLock' + nLock) == null) 
 
     { 
 
     CacheService.getDocumentCache().put('GCSLock' + nLock, true, 1) 
 
     lock = true; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    return lock; 
 
} 
 
/** 
 
* Private helper function that will check for a new version of GCS. 
 
*/ 
 
function versionCheck() 
 
{ 
 
    var versionEndpoint = 'https://raw.githubusercontent.com/nuadi/googlecrestscript/master/version'; 
 
    var newVersion = fetchUrl(versionEndpoint); 
 

 
    if (newVersion != null) 
 
    { 
 
    newVersion = newVersion.getContentText().trim(); 
 
    Logger.log('Current version from Github: ' + newVersion); 
 

 
    var message = 'You are using the latest version of GCS. Fly safe. o7'; 
 
    var title = 'No updates found'; 
 
    if (newVersion > version) 
 
    { 
 
     message = 'A new version of GCS is available on GitHub.'; 
 
     title = 'GCS version ' + newVersion + ' available!'; 
 
    } 
 
    SpreadsheetApp.getActiveSpreadsheet().toast(message, title, 120); 
 
    } 
 
}

der gesamte Code in der Funktion getMarketItemsTrigger bin mit, das ist out kommentiert ist, was ich ohne Glück bereiften haben.

Die kurze Version dieser Frage ist, wie kann ich die Werte in itemList zu Spalte a und b in Blatt Markt-Gegenständen

+0

Hallo, ein Google-Skript muss keine benutzerdefinierte Funktion sein (um als Formel verwendet zu werden). Sie können das Array itemList auch direkt in das Blatt schreiben (aus dem Skript heraus. Diese Funktion kann dann mit einem Zeitbasis-Trigger (einmal im Monat) ausgelöst werden. – JPV

+0

aber wie kann ich die itemList aus dem Skript in das Blatt schreiben? – simondid

+3

ss.getSheetByName ('name_of_sheet_here'). getRange (1, 1, itemList.length, itemList [0] .length) .setValues ​​(itemList) - >> Ändern Sie den Namen und den Bereich des Blattes entsprechend. – JPV

Antwort

0

Sie das Array itemList auf das Blatt durch Zugabe schreiben:

//your code 
ss.getSheetByName('name_of_sheet_here') 
.getRange(1, 1, itemList.length, itemList[0].length) 
.setValues(itemList) 
//more code (if needed) 
} //end of code 

- >> Änderung Blattnamen und Bereich gerecht zu werden.

0

Es gibt zwei Möglichkeiten veröffentlichen, dies zu tun. Wenn Sie möchten, dass es als benutzerdefinierte Funktion ausgeführt wird, haben diese Zugriff auf den Property-Service für Skripts. Sie können einen Zeitstempel in den Skripteigenschaften speichern und ihn jedes Mal überprüfen, wenn die benutzerdefinierte Funktion ausgeführt wird.

https://developers.google.com/apps-script/reference/properties/

https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services

Die zweite ist eine Zeitauslöser erstellen jeden Monat, den Code als cron-Job auszuführen.

https://developers.google.com/apps-script/guides/triggers/installable#time-driven_triggers

https://developers.google.com/apps-script/guides/triggers/installable#managing_triggers_manually

+0

Ich denke, ich habe einen Griff auf den Auslöser pat aus dem Skript, aber ich habe mit der Dateneingabe in der kämpfen Blatt – simondid

Verwandte Themen