Скрипт Google Apps обновляет таблицу слияния из сценария электронных таблиц - PullRequest
3 голосов
/ 16 августа 2011

Я хотел бы создать скрипт приложения в электронной таблице документов Google, который будет периодически копировать строки из листа и вставлять их в таблицу слияния. Ниже я вставил свою лучшую попытку, но следует заметить, что я действительно хочу, чтобы она публиковала диапазон из 2 столбцов, а не эту пару значений. Это просто заполнитель.

Эта ссылка описывает, как общаться с таблицами Fusion. 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 ]

5 голосов
/ 29 декабря 2012

Вот обновленная версия скрипта, который Джон МакГрат через группу Google Fusion Tables создан для создания ручной "синхронизации" между таблицей Google и таблицей Google Fusion.

Я немного изменил сценарий для своих нужд и добавил использование ключа API и новой конечной точки API Fusion Tables , поскольку в исходной версии использовалась конечная точка API SQL , который постепенно сокращается.

Чтобы использовать, просто добавьте идентификатор зашифрованной таблицы Fusion Table вверху скрипта ...

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

И добавьте свой ключ API ...

// key needed for fusion tables api
var fusionTablesAPIKey = '17xnxY......';
4 голосов
/ 26 сентября 2011

Этот сценарий стирает таблицу Fusion и обновляет ее данными первого листа в электронной таблице. Вам нужно создать именованный диапазон (называемый namedRange, но вы можете изменить это в коде). Строка над именованным диапазоном должна быть заголовками. Вам также необходимо установить идентификатор таблицы для таблицы Fusion, которую вы хотите обновить, и убедиться, что имена заголовков соответствуют именам столбцов в таблице Fusion.

Сценарий немного грубоват и в нем отсутствуют комментарии, но, надеюсь, он вам поможет.

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 == "";
}
...