簡體   English   中英

谷歌應用腳本從電子表格腳本更新融合表

[英]Google apps script update fusion table from spreadsheet script

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

}

提前致謝!

這是John McGrath通過 Google Fusion Tables 小組編寫的腳本的更新版本,用於在 Google 電子表格和 Google Fusion Table 之間創建手動“同步”。

I've modified the script a bit for my needs and have added use of an API key and the new Fusion Tables API endpoint as the original version used the SQL API endpoint, which is being phased out.

要使用,只需將 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......';

此腳本擦除 Fusion Table 並使用電子表格中第一張工作表中的數據對其進行更新。 您需要創建一個命名范圍(稱為“namedRange”,但您可以在代碼中更改它)。 命名范圍上方的行應該是標題。 您還需要設置要更新的 Fusion 表的 Table ID,並且需要確保 header 名稱與 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 == "";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM