Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?

問題・目的

  • 特定のスプレッドシートだけを外から更新したい
  • OAuth は大変めんどうかつ、特定のスプレッドシートのみ権限を与えることができない
  • Google Spread Sheet の XML API が全力で面倒

方法

  1. いじりたいスプレッドシートで [ツール] → [スクリプトエディタ…] を開く (Google ドライブの新規作成から、スクリプトを選んでもいい)
  2. スクリプトエディタに code.gs の内容をはっつける。
  3. code.gs の openById() の引数をスプレッドシートのURLの含まれる key=... にする
  4. api_key を適当感じに生成していれる
  5. [ファイル] → [バージョンを管理] でバージョンを生成
  6. [公開] → [ウェブアプリケーションとして導入] で導入する ([アプリケーションにアクセスできるユーザー] は [全員 (匿名ユーザーを含む)] で良い。※ 設定に関わらず dev の環境はログインしていないと叩けない)
  7. call.js みたいな感じで叩く

簡単 JSONP APIの完成!!!

Google Apps Script のホストは https なので、call.js を配信するサーバを https にできれば (例えば、Google Drive の HTTP 公開機能を使うなど) api_key も漏れない (api_key が漏れなければ CSRF もしようがない)。ヘマしない限りは安全! フー!

$.ajax({
url: "https://script.google.com/macros/s/AKfycbx17xFUNNBfkyX3m-0lQ0K9rBDdTyilvRhS3s7zdUQ/dev",
type : "GET",
data : {
api_key : 'XXX',
rows : JSON.stringify([
[ 10, 'aaa', 'xxx'],
[ 20, 'bbb', 'xxx']
])
},
dataType: 'jsonp',
success : function (data, status, xhr) {
console.log(data);
},
complete : function (xhr, status) {
}
});
function doGet (req) {
var result = { ok : 0 };
if (req.parameters.api_key == 'XXX') {
var rows = [];
try { rows = JSON.parse(req.parameters.rows) } catch (e) { }
if (rows.length) {
var ss = SpreadsheetApp.openById('0AiWgSFLaW812dDVlRTl1X2NBdDFGZWI2NGxPejBqcUE');
var sheet = ss.getSheets()[0];
for (var i = 0, len = rows.length; i < len; i++) {
sheet.appendRow(rows[i]);
result.ok++;
}
}
}
return ContentService.createTextOutput(
req.parameters.callback + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JSON);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment