3

定期的にシートの行をコピーしてフュージョンテーブルに挿入するアプリスクリプトをGoogleドキュメントスプレッドシートに作成します。下に私の最高の試みを貼り付けましたが、私は本当にそれが値のペアではなく、2列の範囲を掲示してほしいことに注意する必要があります。それはただのプレースホルダです。ここスプレッドシートスクリプトからGoogle Appsスクリプトのフュージョンテーブル

このリンクは、融合テーブル http://code.google.com/apis/fusiontables/docs/developers_guide.html#Inserting

に話すしかし、私はこれを達成するためのスクリプトを書く方法を理解しない方法について説明します。私はそれを一気に混乱させて、私はこれらの問題を抱えていると思う。

- ポストリクエストを正しく作成していない - 何らかの認証ステップがありません。

私は新しいnewbです。私はここにコピー貼り付けをしています。便利に見えたいくつかの資源:

この男は、POSTリクエストを送信するアプリのスクリプトを作成する方法を考え出したようだが http://blog.vivekhaldar.com/post/428652690/google-apps-script-spreadsheets-mashup-hub

これは、これらの人々がように見える

http://code.google.com/googleapps/appsscript/class_urlfetchapp.html 

重要であると思われます非常に似気にいらをやっているが、私はそれが事前に

http://groups.google.com/group/fusion-tables-users-group/browse_thread/thread/99db4db33e405f01 


function deet() { 
    var advancedArgs = { 
     method: "post", 
     payload: "?sql=" + "INSERT INTO 1299801(Text, Number) VALUES ('Blue Shoes', 50)", 
     headers: {"Authorization": "Basic <base64 encoding of your username:passwd"}}; 
    var response = UrlFetchApp.fetch(
     "https://www.google.com/fusiontables/api/query",advancedArgs); 

} 

感謝を動作させる方法を見つけ出すカント!

+0

はドン以下のすべての回答をい助けてください? – Dino

答えて

4

このスクリプトは、Fusion Tableをワイプし、スプレッドシートの最初のシートのデータで更新します。名前付き範囲(「namedRange」と呼ばれますが、コード内でこれを変更することができます)を作成する必要があります。名前付き範囲の上にある行はヘッダーにする必要があります。また、更新するFusionテーブルのテーブルIDを設定する必要があります。また、ヘッダ名がFusion Tableのカラム名と一致するようにする必要があります。

スクリプトは少し粗悪で、コメントがありませんが、うまくいけば助けになります。

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menuEntries = [ {name: "Update Fusion Table", functionName: "updateFT"} ]; 
    ss.addMenu("Fusion Tables", menuEntries); 
} 

function updateFT() { 
    var tableID = '99999' // Add the table ID of the fusion table here 
     var email = UserProperties.getProperty('email'); 
    var password = UserProperties.getProperty('password'); 

    if (email === null || password === null) { 
    email = Browser.inputBox('Enter email'); 
    password = Browser.inputBox('Enter password'); 
    UserProperties.setProperty('email',email); 
    UserProperties.setProperty('password', password); 
    } else { 
    email = UserProperties.getProperty('email'); 
    password = UserProperties.getProperty('password'); 
    } 
    var authToken = getGAauthenticationToken(email,password); 
    deleteData(authToken, tableID); 
    var updateMsg = updateData(authToken, tableID); 
    var updatedRowsCount = updateMsg.split(/\n/).length - 2; 
    Browser.msgBox("Fusion Tables Update", "Updated " + updatedRowsCount + " rows in the Fusion Table", Browser.Buttons.OK); 
} 


function getGAauthenticationToken(email, password) { 
    password = encodeURIComponent(password); 
    var response = UrlFetchApp.fetch("https://www.google.com/accounts/ClientLogin", { 
    method: "post", 
    payload: "accountType=GOOGLE&Email=" + email + "&Passwd=" + password + "&service=fusiontables&Source=testing" 
    }); 
    var responseStr = response.getContentText(); 
    responseStr = responseStr.slice(responseStr.search("Auth=") + 5, responseStr.length); 
    responseStr = responseStr.replace(/\n/g, ""); 
    return responseStr; 
} 

function queryFusionTables(authToken, query) { 
    var URL = "http://www.google.com/fusiontables/api/query"; 
    var response = UrlFetchApp.fetch(URL, { 
    method: "post", 
    headers: { 
     "Authorization": "GoogleLogin auth=" + authToken, 
    }, 
    payload: "sql=" + query 
    }); 
    return response.getContentText(); 
} 

function deleteData(authToken, tableID) { 
    var query = encodeURIComponent("DELETE FROM " + tableID); 
    return queryFusionTables(authToken, query); 
} 

function updateData(authToken, tableID) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var blockDataRange = ss.getRangeByName('namedRange'); 
    var query = constructQuery(ss, blockDataRange, tableID); 
    // Browser.msgBox(query); 
    return queryFusionTables(authToken, query); 
} 

function constructQuery(ss, range, tableID, columnHeadersRowIndex) { 
    var sheet = ss.getSheets()[0]; 
    var columnHeadersRowIndex = columnHeadersRowIndex || range.getRowIndex() - 1; 
    var numColumns = range.getEndColumn() - range.getColumn() + 1; 
    var headersRange = sheet.getRange(columnHeadersRowIndex, range.getColumn(), 1, numColumns); 
    var headers = headersRange.getValues()[0]; 
    var data = range.getValues(); 
    var queryPrepend = "INSERT INTO " + tableID + " ("+headers.join(",") + ") VALUES ('"; 
    var query = ""; 

    for (var i = 0; i < data.length; ++i) { 
    var hasData = false; 
    if (isCellEmpty(data[i][0])) { 
     continue; 
    } 
    query += queryPrepend + data[i].join("','") + "'); "; 
    } 
    return encodeURIComponent(query); 
} 

// Returns true if the cell where cellData was read from is empty. 
// Arguments: 
// - cellData: string 
function isCellEmpty(cellData) { 
    return typeof(cellData) == "string" && cellData == ""; 
} 
5

はここでGoogleのフュージョンテーブル基を介してJohn McGrathがGoogleスプレッドシートとGoogle Fusionの表の間でマニュアル「同期」を作成するために執筆していること、スクリプトのupdated versionです。

自分のニーズに合わせてスクリプトを少し変更し、API keynew Fusion Tables API endpointを元のバージョンとして使用して、SQL APIエンドポイントを段階的に廃止しました。

...単にスクリプトの先頭にあなたの融合表の暗号化されたテーブルのIDを追加し、
// Add the encrypted table ID of the fusion table here 
var tableIDFusion = '17xnxY......'; 

を使用して、あなたのapi keyを追加するには...

// key needed for fusion tables api 
var fusionTablesAPIKey = '17xnxY......'; 
関連する問題