我想在Google文档电子表格中创建一个应用程序脚本,该脚本会定期从工作表中复制行并将其插入到融合表中。下面我粘贴了我最好的尝试,但应该注意的是,我真的希望它发布2列范围,而不是那对值。那只是一个占位符。
此链接描述了如何与融合表对话 http://code.google.com/apis/fusiontables/docs/developers_guide.html#Inserting
但我不明白如何编写脚本来实现这一目标。我已经乱搞了一堆,我想我有这些问题
- 我没有正确地形成发布请求 - 我错过了某种身份验证步骤。
我是一个全新的,我在这里复制粘贴。一些看起来很有帮助的资源:
这家伙似乎已经想出如何编写应用脚本来发送帖子请求 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 :(得分:5)
这是一个updated version脚本,John McGrath通过Google Fusion Tables小组创作,用于在Google电子表格和Google Fusion Table之间创建手动“同步”。
我已根据我的需要修改了一些脚本,并添加了API key和new Fusion Tables API endpoint的使用,因为原始版本使用了SQL API端点,正在逐步淘汰。
要使用,只需将Fusion Table的加密表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......';
答案 1 :(得分: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 == "";
}