Google应用脚本更新电子表格脚本中的融合表

时间:2011-08-16 17:49:18

标签: google-apps-script google-sheets google-fusion-tables google-apps google-docs

我想在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);

}

提前致谢!

2 个答案:

答案 0 :(得分:5)

这是一个updated version脚本,John McGrath通过Google Fusion Tables小组创作,用于在Google电子表格和Google Fusion Table之间创建手动“同步”。

我已根据我的需要修改了一些脚本,并添加了API keynew 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 == "";
}