3

我想在Google文档电子表格中创建一个应用脚本,该脚本会定期从表单中复制行并将其插入到融合表中。下面我贴了我最好的尝试,但应该指出,我真的希望它发布2列范围,而不是那对值。这只是一个占位符。Google电子表格脚本中的Google应用脚本更新融合表

这这里链接介绍如何去跟融合表 http://code.google.com/apis/fusiontables/docs/developers_guide.html#Inserting

但我不知道如何写脚本来实现这一点。我已经搞砸了一堆,我认为我有这些问题

- 我没有正确地形成发布请求 - 我缺少某种身份验证步骤。

我是一个总的新手,我在这里是复制粘贴。看起来一些实用的资源:

这家伙似乎已经想通了如何编写一个应用程序脚本发送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表中的列名匹配。

该脚本有点粗糙,缺乏评论,但希望它会帮助你。

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

以下脚本的updated version是通过创作来创建一个谷歌电子表格和谷歌的融合表之间手动“同步”的谷歌的Fusion Tables组John McGrath

我已经根据自己的需要修改了脚本,并添加了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......'; 
相关问题