私は、Google アプリ スクリプトとフュージョン テーブルを初めて使用します。私は自分の会社向けに CRM アプリを開発しており、そのために Google サイト、Google アプリ スクリプト、フュージョン テーブルを使用しています。また、O'Reilly の書籍「Google Script - Enterprise Application Essentials」の例を使用してアプリを作成しています。プロジェクトのデータベースとしてフュージョン テーブルを使用しています。関数 doOAuth() を実行して、全員にフュージョン テーブルでアクションを実行する権限を与えます (本から取得した doOAuth コードを含む以下のコードを参照してください)。アプリは、フュージョン テーブルに対して行うすべてのコマンドに対して正常に動作します。テーブルの内容を読み取ることができ、それを検索することもできますが、テーブルに新しいデータを書き込んだり既存のデータを更新したりすると、厄介な問題に直面しています。アプリにデータを挿入するテキストボックスがいくつかありますが、これらのデータはテーブルに書き込まれますが、これまでのところ問題はありません。これらのテキストボックスに共通のテキストを追加すると、データを更新したり、融合テーブルにデータを挿入したりするときに問題はありません。しかし、これらのテキスト ボックスに á,ã,à,ä,é,õ,í などの特殊文字を追加すると、そのプロセスを実行するには認証が必要であるというメッセージが表示されます。しかし、私はすでに許可を与えました。権限が失われたようです。そして、再度 doOAuth() 関数を実行しても、パーミッションは与えられません。insertFusionObj() および writeFusionObj() 関数 (以下のコードに記載) は、パラメータが特殊文字の場合に問題があるようです。それが関数の問題なのか、融合テーブルの挿入と更新の問題なのかはわかりません。誰かがその問題について私を助けてくれれば、本当に感謝しています。
私はいくつかの助けを楽しみにしています。よろしく ラファエル・セッティ・ノゲイラ
コード:
/**
* ---FusionService---
*
* Copyright (c) 2011 James Ferreira
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FusionService
* @author James Ferreira
* @documentation http://goo.gl/pBSvF
*
* @requires Script Insert ID: ?????
* ObjService http://goo.gl/JdEHW
*
* @requires The Fusion Table ID MUST be set in a Script property.
* This will allow you to change it at anytime using
* ScriptProperties.setProperty('FUSION_ID', '<your ID>');
*
*
* Search for records in a Fusion Table
*
* @params {string} target Quoted column name(s) ('First Name', 'Last Name') OR (*) for all
* @params {string} where valid statement see http://goo.gl/SkHI1
* 'Last Name' CONTAINS IGNORING CASE 'Ferr'
* AND 'First Name' CONTAINS IGNORING CASE 'J'"
*
* @returns {array} [[headers],[match row],[match row]...]
* If no match returns []
*/
function searchFusion(target, where){
var values = [];
if (target == '*'){
var headers = getFusionHeaders();
for(var i in headers){
values.push("'"+headers[i]+"'");
}
}else{
values.push(target);
}
var arrayResult = fusionRequest("get", "SELECT "+values.toString()+",ROWID FROM "+
FUSION_ID+" WHERE "+ where).split(/\n/);
for (var i in arrayResult){
arrayResult[i] = arrayResult[i].split(/,/);
}
arrayResult.splice(arrayResult.length-1, 1);
return arrayResult;
}
/**
* Updates a record in the Fusion table
* Note: fusionObj must contain rowid of Fusion table record
*
* @params {object} fusionObj object with properties from cameled column names
* @returns {string} OK if successful
*/
function writeFusionObj(fusionObj){
var values = [];
var headers = getFusionHeaders();
for(var i in headers){
if (fusionObj[camelString(headers[i])] != undefined)
values.push("'"+headers[i] +"'='"+fusionObj[camelString(headers[i])]+"'");
}
return fusionRequest("post", "UPDATE "+FUSION_ID+" SET "+values.toString()+
" WHERE ROWID = '"+fusionObj.rowid+"'")
}
/**
* Add a new record to a Fusion table
*
* @params {object} fusionObj object with properties from cameled column names
* @returns {integer} rowid useful for unique ID of record
*/
function insertFusionObj(fusionObj){
var values = [];
var columns =[];
var headers = getFusionHeaders();
for(var i in headers){
columns.push("'"+headers[i] +"'");
values.push("'"+fusionObj[camelString(headers[i])]+"'");
}
return parseInt(fusionRequest("post", "INSERT INTO "+FUSION_ID+
" ("+columns.toString()+") VALUES ("+values.toString()+")").substring(5));
}
/**
* Get the Fusion row ID for a given column header and unique value
*
* @returns {integer} Fusion ROWID for record
*/
function getFusionROWID(header, key){
return parseInt(fusionRequest("get", "SELECT ROWID FROM "+FUSION_ID+
" WHERE '"+header+"'='"+key+"'").substring(5));
}
/**
* get the column header names from Fusion Table
*
* @returns {array} [header, header, ...]
*/
function getFusionHeaders(){
var headers = [];
var result = fusionRequest("get", "DESCRIBE "+FUSION_ID).split(/\n/);
for (var i in result){
result[i] = result[i].split(/,/);
headers.push(result[i][1]);
}
headers.splice(0, 1);
headers.splice(headers.length-1, 1);
return headers;
}
/**
* Deletes a record in the Fusion Table
*
* @params {string} rowid the ID of a Fusion table row
*/
function deleteFusionRow(rowid){
fusionRequest("post", "DELETE FROM "+FUSION_ID+" WHERE ROWID = '"+rowid+"'");
}
/**
* The get or post request to the Fusion API
*
* @params {string} reqMethod get or post
* @params {string} sql String A sgl type request see http://goo.gl/aVP3B
* @returns {integer} Fusion rowid useful for unique ID of record
*/
function fusionRequest(method, sql) {
var url = "https://www.google.com/fusiontables/api/query";
if (USE_OAUTH){
var fetchArgs = googleOAuth_();
}else{
var fetchArgs = new Object();
fetchArgs.headers = {"Authorization": "GoogleLogin auth=" + getAuthToken_()};
}
fetchArgs.method = method;
if( method == 'get' ) {
url += '?sql='+sql;
fetchArgs.payload = null;
} else{
fetchArgs.payload = 'sql='+sql;
}
return UrlFetchApp.fetch(url, fetchArgs).getContentText();
}
/**
* @private for OAuth
*/
function googleOAuth_() {
var oAuthConfig = UrlFetchApp.addOAuthService('fusion');
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
"OAuthGetRequestToken?scope=https://www.google.com/fusiontables/api/query");
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey('anonymous');
oAuthConfig.setConsumerSecret('anonymous');
return {oAuthServiceName:'fusion', oAuthUseToken:"always"};
}
/**
* @private for client Auth
* @returns String(auth token for a user)
*/
function getAuthToken_() {
var response = UrlFetchApp.fetch("https://www.google.com/accounts/ClientLogin", {
method: "post",
payload: "accountType=GOOGLE" +
"&Email=" + ScriptProperties.getProperty('CUSTOMER_KEY') +
"&Passwd=" + encodeURIComponent(ScriptProperties.getProperty('CUSTOMER_SECRET'))+
"&service=fusiontables" +
"&Source=testing"
});
var responseStr = response.getContentText();
responseStr = responseStr.slice(responseStr.search("Auth=") + 5, responseStr.length);
responseStr = responseStr.replace(/\n/g, "");
return responseStr;
}
/**
* Used to authenticate to Fusion Tables
* Run it twice!
*/
function doOAuth(){
var method = 'get';
var sql = "SHOW TABLES";
Logger.log(fusionRequest(method,sql));
}
var USE_OAUTH = true;
var FUSION_ID = ScriptProperties.getProperty('FUSION_ID');