3

シートから定期的に行をコピーしてフュージョン テーブルに挿入する 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);

}

前もって感謝します!

4

2 に答える 2

5

これは、GoogleスプレッドシートとGoogleFusionTableの間で手動の「同期」を作成するためにGoogleFusionTablesグループを介してJohnMcGrathが作成したスクリプトの更新バージョンです。

必要に応じてスクリプトを少し変更し、APIキー新しいFusion Tables APIエンドポイントの使用を追加しました。これは、元のバージョンが段階的に廃止されているSQLAPIエンドポイントを使用していたためです。

使用するには、FusionTableの暗号化されたテーブル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」と呼ばれますが、これはコードで変更できます)。名前付き範囲の上の行がヘッダーになります。また、更新するフュージョン テーブルのテーブル ID を設定する必要があり、ヘッダー名がフュージョン テーブルの列名と一致していることを確認する必要があります。

スクリプトは少し粗雑でコメントがありませんが、お役に立てれば幸いです。

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 に答える