3

我想在 google docs 电子表格中创建一个应用程序脚本,该脚本将定期从工作表中复制行并将它们插入到融合表中。下面我粘贴了我的最佳尝试,但应该注意的是,我真的希望它发布一个 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);

}

提前致谢!

4

2 回答 2

5

这是John McGrath通过 Google Fusion Tables 小组编写的脚本的更新版本,用于在 Google 电子表格和 Google Fusion Table 之间创建手动“同步”。

我已经根据自己的需要稍微修改了脚本,并添加了API 密钥新 Fusion Tables API 端点的使用,因为原始版本使用了 SQL API 端点,该端点正在逐步淘汰。

要使用,只需将 Fusion Table 的加密表 ID 添加到脚本顶部...

// Add the encrypted table ID of the fusion table here
var tableIDFusion = '17xnxY......';

并添加您的api 密钥...

// key needed for fusion tables api
var fusionTablesAPIKey = '17xnxY......';
于 2012-12-29T16:14:52.837 回答
4

此脚本擦除 Fusion Table 并使用电子表格中第一张工作表中的数据对其进行更新。您需要创建一个命名范围(称为“namedRange”,但您可以在代码中更改它)。命名范围上方的行应该是标题。您还需要设置要更新的 Fusion 表的 Table 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 == "";
}
于 2011-09-26T06:42:14.593 回答