본 기사의 첫 번째 파트에서는 Google Spreadsheets 클라우드에 호스트된 사용자 공간 스프레드시트 데이터와 관련된 새 애플리케이션을 개발자가 손쉽게 빌드할 수 있게 해주는 REST API인 Google Spreadsheets Data API를 소개했다. 그리고 스프레드시트, 워크시트, 목록 및 셀 피드의 기초를 설명하면서 Zend Framework에서 이런 피드를 사용하여 빠르고 효율적으로 스프레드시트 내용을 PHP 애플리케이션으로 가져올 수 있는 방법을 보여주었다.
하지만, Google Spreadsheets Data API는 스프레드시트 검색 및 가져오기만 지원하는 것은 아니다. 기사 시리즈의 결론이 되는 이번 파트에서는 Data API를 사용하여 원격 PHP 애플리케이션에서 행, 셀 및 워크시트를 추가, 업데이트 및 삭제함으로써 스프레드시트 내용을 원격으로 조작할 수 있는 방법을 살펴본다. 본 기사에서 설명하는 기법은 두 가지 예제 애플리케이션으로 보완되며, 이들은 각각 Data API를 사용하여 RSS 피드와 SQL 결과 세트를 읽고 Google Spreadsheet로 가져온다.
모든 스프레드시트에는 하나 이상의 워크시트가 있고, Google Spreadsheets Data API를 사용하면 프로그래밍을 통해 이런 워크시트에 액세스하여 조작할 수 있다. 이 API의 작동 방식을 보려면 Google Spreadsheets 서비스로 이동하여 로그인하고 빈 스프레드시트를 작성한다. URL에서 표시되어야 하는 스프레드시트 키를 확인한다. 빈 스프레드시트는 그림 1과 닮은 모습이다.
그림 1. 새로운 빈 스프레드시트
이 스프레드시트에 새 워크시트를 추가하려면 Atom 형식으로 된 새 워크시트 항목을 생성한 다음, 지정된 스프레드시트의 워크시트 URL에 이 항목을 POST해야 한다. 이 프로세스를 설명하는 리스트 1을 고찰해보자.
리스트 1. 새 워크시트 추가
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Creating worksheets</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// get spreadsheet entry
$ssEntry = $service->getSpreadsheetEntry(
'https://spreadsheets.google.com/feeds/spreadsheets/ssid');
// get worksheet feed for this spreadsheet
$wsFeed = $service->getWorksheetFeed($ssEntry);
// create new entry
$doc = new DOMDocument();
$doc->formatOutput = true;
$entry = $doc->createElement('atom:entry');
$entry->setAttributeNS('http://www.w3.org/2000/xmlns/' ,
'xmlns:atom', 'http://www.w3.org/2005/Atom');
$entry->setAttributeNS('http://www.w3.org/2000/xmlns/' ,
'xmlns:gs', 'http://schemas.google.com/spreadsheets/2006');
$doc->appendChild($entry);
// add title, row and column counts
$title = $doc->createElement('atom:title', 'Jan 2011');
$entry->appendChild($title);
$rows = $doc->createElement('gs:rowCount', '10');
$entry->appendChild($rows);
$cols = $doc->createElement('gs:colCount', '10');
$entry->appendChild($cols);
// insert entry
$entryResult = $service->insertEntry($doc->saveXML(),
$wsFeed->getLink('self')->getHref());
echo 'The ID of the new worksheet entry is: ' . $entryResult->id;
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
처음에는 Zend_Gdata_Spreadsheets 컴포넌트가 (아직) 워크시트 추가 또는 업데이트를 위한 기본 메소드를 제공하지 않는다는 점이 중요하다. 그래도 제공하는
것은 가능하다. XML 워크시트 요소를 수동으로 작성하고 그 요소를 올바른 URL에 POST하기 위한 일반적인 insertEntry() 메소드를
사용해야 한다.
리스트 1 에서는 우선 명명된 스프레드시트 항목에 대한 참조를 구한 다음 그 항목의 워크시트 피드를
구한다. 그 다음, 실제 항목을 표시하기 위한 DOMDocument 오브젝트가 작성되고, 워크시트 제목, 행 수 및 열 수를 지정하기 위해 그 오브젝트에 요소가
추가된다. 마지막으로, 변경 내용이 스프레드시트에 커미트되도록 하기 위해 insertEntry() 메소드가 워크시트 피드의 URL로 XML
단편을 보낸다.
이 스크립트를 실행하고 Google Spreadsheets GUI로 다시 돌아가면, 그림 2에서와 같이 빈 스프레드시트 내부에 새 워크시트가 보인다.
그림 2. 새 워크시트가 추가된 스프레드시트
이 태스크에 대한 또 다른 접근 방법은 Zend_Gdata_Spreadsheets_WorksheetEntry 오브젝트의 인스턴스를 작성하고 그 특성을 설정한 다음, 이 항목 오브젝트를 워크시트 피드 URL에 게시하는 것이다. 최종 결과는 같지만, Zend_Gdata_Spreadsheets가 워크시트 항목 XML 생성의 세부사항을 처리하므로 이 접근 방법을 따르는 것이 조금 더 간단하다. 리스트 1과 동등한 결과물을 생성하기 위한 이 대체 접근 방법을 보여주는 리스트 2를 고찰해보자.
리스트 2. 새 워크시트 추가
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Creating worksheets</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// get spreadsheet entry
$ssEntry = $service->getSpreadsheetEntry(
'https://spreadsheets.google.com/feeds/spreadsheets/ssid');
// get worksheet feed for this spreadsheet
$wsFeed = $service->getWorksheetFeed($ssEntry);
// create new entry
$wsEntry = new Zend_Gdata_Spreadsheets_WorksheetEntry();
$title = new Zend_Gdata_App_Extension_Title('Jan 2011');
$wsEntry->setTitle($title);
$row = new Zend_Gdata_Spreadsheets_Extension_RowCount('10');
$wsEntry->setRowCount($row);
$col = new Zend_Gdata_Spreadsheets_Extension_ColCount('10');
$wsEntry->setColumnCount($col);
// insert entry
$entryResult = $service->insertEntry($wsEntry,
$wsFeed->getLink('self')->getHref());
echo 'The ID of the new worksheet entry is: ' . $entryResult->id;
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
리스트 2 에서는 워크시트 제목, 행 개수 및 열 개수에 대한 Zend_Gdata_Spreadsheets_Extension 오브젝트를
작성한 다음, 이들 오브젝트를 기본 Zend_Gdata_Spreadsheets_WorksheetEntry 오브젝트에 연결한다. 이 접근 방법은 이해하기도 더 쉽고 구현하는 데 걸리는 시간도
더 짧다. 앞서 설명한 바와 같이, 최종 항목 오브젝트는 insertEntry() 메소드를 사용하여 워크시트 피드 URL로 전송된다.
워크시트 추가 외에, Google Spreadsheets Data API는 프로그램을 통한 워크시트 업데이트 및 제거도 지원한다. 이 두 가지 작업 모두 사용자가 수정하거나 삭제할 워크시트 항목을 검색하고, 필요에 따라 항목에 대한 변경 작업을 수행한 다음, 실행을 위해 이를 서버로 다시 전송해야 한다. 요청(PUT 또는 DELETE)의 특성이 워크시트 항목의 업데이트 또는 삭제 여부를 결정한다.
이 기능의 작동을 보기 위해, 리스트 1에서 작성된 워크시트의 제목을 업데이트하는 리스트 3을
고찰해보자. 이 목록과 뒤에 나오는 목록들의 경우, insertEntry() 메소드에서 리턴되는 항목 오브젝트 또는 스프레드시트 피드에서
구할 수 있는 워크시트 키가 있어야 한다.
리스트 3. 워크시트 업데이트
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Updating worksheets</title>
<style>
body {
font-family: Verdana;
}
table, td {
border: 1px solid black;
vertical-align: top;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// get worksheet entry
$query = new Zend_Gdata_Spreadsheets_DocumentQuery();
$query->setSpreadsheetKey('ssid');
$query->setWorksheetId('wsid');
$wsEntry = $service->getWorksheetEntry($query);
$title = new Zend_Gdata_App_Extension_Title('Feb 2012');
$wsEntry->setTitle($title);
// update entry
$entryResult = $service->updateEntry($wsEntry,
$wsEntry->getLink('edit')->getHref());
echo 'The ID of the updated worksheet entry is: ' . $entryResult->id;
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
리스트 3 에서는 이전 예제들에서 본 getWorksheetEntry() 메소드를 사용하여 고유
ID로 특정 워크시트 항목을 검색한다. 항목 오브젝트의 setTitle() 메소드는 워크시트 제목을 변경하고, updateEnry()
메소드를 사용하여 수정된 항목이 다시 전송된다. 수정된 항목은 항목 오브젝트에 의해 지정된 편집 URL로 전송되어야 한다.
이 프로시저를 실행한 후, 그림 3의 Google Spreadsheets GUI에서 수정된 워크시트를 볼 수 있다.
그림 3. 새 워크시트가 업데이트된 스프레드시트
워크시트를 삭제하려면 단순히 해당 워크시트 항목의 delete() 메소드를 호출한다. 리스트 4 에는
리스트 3에서 워크시트를 삭제하는 예제가 있다.
리스트 4. 워크시트 삭제
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Deleting worksheets</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// get worksheet entry
$query = new Zend_Gdata_Spreadsheets_DocumentQuery();
$query->setSpreadsheetKey('ssid');
$query->setWorksheetId('wsid');
$wsEntry = $service->getWorksheetEntry($query);
// delete entry
$service->delete($wsEntry->getLink('edit')->getHref());
echo 'The worksheet entry has been deleted';
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
전과 같이, 이 스크립트는 워크시트 항목을 검색한 다음, delete() 메소드를 호출하여 DELETE 요청을 항목의 편집 URL로
전송한다. Google API 서버에서 이 요청을 해석하고 실행하여 스프레드시트에서 워크시트를 제거한다. 원래 상태로 복원된 스프레드시트를 보여주는
그림 4에서 이 단계를 분명히 볼 수 있다.
그림 4. 새 워크시트를 삭제한 후의 스프레드시트
Google Spreadsheets Data API를 사용하면 워크시트에 행을 추가할 수도 있고, 현재 Zend_Gdata_Spreadsheets 컴포넌트에 이 작업을 수행하기 위한 기본 메소드가 있다. 행을 추가하려면 그 행을 나타내는 새 Zend_Gdata_Spreadsheets_ListEntry 오브젝트를 작성하고, 그 오브젝트에 값을 채운 다음, 오브젝트를 목록 피드 URL에 POST한다. 리스트 5 에 예제가 있다.
리스트 5. 워크시트 행 추가
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Adding worksheet rows</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// create row content
$row = array(
"date" => "24-12-2010",
"task" => "Server reconfiguration",
"hours" => "3.5"
);
// insert new row
$entryResult = $service->insertRow($row, $ssKey, $wsKey);
echo 'The ID of the new row entry is: ' . $entryResult->id;
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
리스트 5 에서는 대상 스프레드시트 및 워크시트를 설정한 다음, 열 값 맵핑을 포함한 행 데이터 배열을
작성한다. 그러면 이 배열이 필요한 항목 오브젝트를 작성하여 피드 URL에 게시하는 insertRow() 메소드로 전달된다. 그림 5 에
Google Spreadsheets GUI의 결과가 표시되어 있다. (그림 5의 확대 버전을 본다.)
그림 5. 새 행이 추가된 워크시트
프로그램 방식으로 행을 추가할 때 다음 중요 사항에 주의한다.
- 대상 워크시트가 이미 존재해야 하고 헤더 행의 필드가 이미 정의되어 있어야 한다.
insertRow()로 전달되는 행 배열에는 대상 워크시트의 열에 해당하는 키가 포함되어야 하며, 단지 값만 입력하는 것으로는 충분하지 않고 네임스페이스 오류가 발생한다.- 대상 워크시트의 헤더 행과 일치하는 키를 가진 필드만 삽입된다.
- 행 배열의 키를 대문자로 쓰면 안 된다. 이런 형식은 보통 서버 오류를 발생시켜 행 삽입에 실패하기 때문이다.
Data API를 사용하여 행을 업데이트하고 삭제할 수도 있다. 이 작업을 수행하려면 수정할 행 항목을 검색하고 변경한 다음, 목록 피드 URL로 다시 전송해야 한다. 요청이 PUT 또는 DELETE로 전송되는지 여부가 워크시트에서 행이 수정 또는 삭제되는지 여부를 결정한다.
리스트 6 은 워크시트에서 행을 업데이트하는 프로세스를 나타낸 것이다.
리스트 6. 워크시트 행 업데이트
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Updating worksheet rows</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// get rows matching query
$query = new Zend_Gdata_Spreadsheets_ListQuery();
$query->setSpreadsheetKey($ssKey);
$query->setWorksheetId($wsKey);
$query->setSpreadsheetQuery('salesunits > 25000')
$listFeed = $service->getListFeed($query);
// iterate over matching rows
// increase sales units by 50%
// write updated rows back to spreadsheet
foreach ($listFeed as $listEntry) {
$rowData = $listEntry->getCustom();
$newRow = array();
foreach($rowData as $field) {
$newRow[$field->getColumnName()] = $field->getText();
if ($field->getColumnName() == 'salesunits') {
$newRow[$field->getColumnName()] = $field->getText()*1.5;
}
}
$entryResult = $service->updateRow($listEntry, $newRow);
}
echo 'Rows successfully updated.';
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
리스트 6 에서는 특정 한계를 초과하는 판매 대수를 포함한 워크시트에 있는 모든 행을 목록 피드로서 리턴하는
목록 쿼리를 작성한다. 그런 다음, 이 피드에 대해 반복하면서 차례대로 각각의 행을 처리하고 각 행에 있는 특정 셀의 값을 조정한다. 그런 다음, 업데이트된 행이
updateRow() 메소드를 통해 스프레드시트에 다시 쓰인다.
그림 6 은 업데이트 전후의 스프레드시트를 나타낸 것이다. (그림 6의 확대 버전을 본다.)
그림 6. 일부 행이 업데이트된 워크시트
서비스 오브젝트의 updateRow() 메소드를 호출하는 대신 행 항목의 delete() 메소드를 호출한다는 점을
제외하면, 행 삭제도 비슷한 프로세스를 따른다. 리스트 7 은 지정된 워크시트의 마지막 행을 삭제하는 방법을 나타낸
것이다.
리스트 7. 워크시트 행 삭제
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Deleting worksheet rows</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// get list feed
$query = new Zend_Gdata_Spreadsheets_ListQuery();
$query->setSpreadsheetKey($ssKey);
$query->setWorksheetId($wsKey);
$listFeed = $service->getListFeed($query);
// get and delete last row
$lastEntry = $listFeed->offsetGet($listFeed->count()-1);
$lastEntry->delete();
echo 'Row successfully deleted.';
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
그림 7 은 업데이트 전후의 스프레드시트를 나타낸 것이다. (그림 7의 확대 버전을 본다.)
그림 7. 행이 삭제된 워크시트
이제 행 추가 및 삭제 방법을 알고 있으므로, 이를 실제로 보여주는 간단한 애플리케이션을 만들어보자. 원격 RSS 피드에서 모든 뉴스 기사를 검색하고, 피드에서 기사 메타데이터를 추출하고, 스프레드시트 행 및 열에 추출한 메타데이터를 넣는 RSS-스프레드시트 변환기를 만들어 볼 것이다.
시작하기 전에 Google Spreadsheets GUI로 다시 돌아가서 전형적인 RSS 피드에 있는 필드에 해당하는 헤더 행을 포함한 빈 스프레드시트를 작성한다. 그 결과는 그림 8과 유사해야 한다.
그림 8. 빈 워크시트
이 경우의 예제 피드는 맨 위 영국 뉴스 기사에 대한 간략한 설명이 있는 BBC의 영국(UK) 뉴스 피드이다. Zend Framework의 Zend_Feed 컴포넌트가 있으므로, Data API를 사용하여 아주 손쉽게 뉴스 피드를 구문 분석하고, 그로부터 정보를 추출한 다음, Google Spreadsheet에 그 정보를 쓸 수 있다. 리스트 8 에 코드가 있다.
리스트 8. RSS 피드에서 워크시트 행 가져오기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Importing worksheet rows from an RSS feed</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Feed_Rss');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// consume RSS feed
// insert each channel item as a spreadsheet row
// if large feed, increase PHP script execution time
$channel = new Zend_Feed_Rss('http://feeds.bbci.co.uk/news/uk/rss.xml');
foreach ($channel as $item) {
$row = array();
$row['title'] = $item->title();
$row['description'] = $item->description();
$row['link'] = $item->link();
$row['date'] = $item->pubDate();
$entryResult = $service->insertRow($row, $ssKey, $wsKey);
}
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
Zend_Feed 컴포넌트를 사용하면 RSS 피드를 매우 쉽게 구문 분석할 수 있다. 단순히 RSS 피드 URL을 오브젝트 생성자로 전달하면, 생성자가 피드를 검색하고
구문 분석하여 반복 가능한 일련의 오브젝트로 변환한다. 리스트 8 에서는 피드의 항목에 대해 반복하고 각 항목에
대한 배열을 작성하여 이 작업을 수행한다. 그런 다음, 이 배열은 insertRow() 메소드를 사용하여 스프레드시트에 행으로
삽입된다. 이 프로세스는 RSS 피드의 모든 항목이 처리될 때까지 계속된다.
그림 9 는 그 결과가 어떻게 보이는지 나타낸 것이다.
그림 9. RSS 피드의 행을 포함한 워크시트
Data API에서는 현재 행 데이터의 배치 삽입을 허용하지 않는다. 하지만, 행의 순서가 중요하지 않은 경우에는 신속히 처리하기 위해 병렬 전송 요청을 고려할 수 있다.
워크시트 행을 수정할 수 있는 것과 마찬가지로, 워크시트 셀을 수정할 수도 있다. 짐작했을 수도 있겠지만, 이 수정 작업을 수행하기 위해 업데이트할 셀의 세부사항을 포함한 워크시트의 셀 피드로 수정된 항목을 전송한다.
서비스 오브젝트의 updateCell() 메소드는 셀을 업데이트한다. 이 메소드는 행 인덱스, 열 인덱스, 셀 값, 스프레드시트 키 및
워크시트 키의 다섯 가지 인수를 수락한다. 행 및 열 인덱스는 1부터 시작된다. 리스트 9 는 그 작동 방식을 나타낸
것이다.
리스트 9. 워크시트 셀 업데이트
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Updating worksheet cells</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// update cell at row 6, column 5
$entry = $service->updateCell('6', '5', 'Hello, world', $ssKey, $wsKey);
echo 'Updated cell ' . $entry->getTitle()->getText() . ' |
updateCell()에 대한 호출은 특정 정보에 대해 구문 분석 가능한 셀 항목 오브젝트를 리턴한다. 특히, 셀 항목 오브젝트의 제목은
업데이트된 셀의 영숫자 좌표를 리턴한다는 점에 주목하자.
그림 10 은 스크립트의 결과물을 나타낸 것이다.
그림 10. 셀 업데이트 결과
그림 11 은 Google Spreadsheets GUI의 결과를 나타낸 것이다.
그림 11. 업데이트된 셀을 포함한 워크시트
또 다른 접근 방법은 특정 셀을 리턴하기 위한 셀 쿼리를 사용한 다음, setInputValue() 메소드를 사용하여 이 셀을 업데이트하는
것이다. 또한, 정적 값 대신 수식을 입력할 수 있다. 리스트 10 은 이를 나타낸 것이다.
리스트 10. 워크시트 셀 업데이트
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Updating worksheet cells</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// get cell feed
// restrict feed to single cell E4
$query = new Zend_Gdata_Spreadsheets_CellQuery();
$query->setSpreadsheetKey($ssKey);
$query->setWorksheetId($wsKey);
$query->setMinRow(4);
$query->setMaxRow(4);
$query->setMinCol(5);
$query->setMaxCol(5);
$cellFeed = $service->getCellFeed($query);
// get cell from query
$cellEntry = $cellFeed->offsetGet(0);
// update cell value and save back to spreadsheet
$cellEntry->getCell()->setInputValue('=B2');
$service->updateEntry($cellEntry, $cellEntry->getLink('edit')->getHref());
echo 'Updated cell ' . $cellEntry->getTitle()->getText();
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
이 경우, 셀 값은 다른 셀을 참조하는 공식으로 설정되고, 수정된 항목은 서비스 오브젝트의 updateEntry() 메소드를 사용하여
다시 쓰인다.
이 모든 정보를 가진 상태에서, MySQL 데이터베이스에서 스프레드시트 데이터를 가져오는 다른 예제를 살펴보자. 그림 12에서 데이터베이스 구조가 있다는 점을 고려하자. (그림 12의 텍스트 전용 버전을 본다.)
그림 12. 예제 데이터베이스
아주 손쉽게 SQL 쿼리를 실행한 다음, 쿼리 결과 세트의 각 필드에서 스프레드시트 셀을 작성할 수 있다. 작업 예제가 있는 리스트 11을 고찰해보자.
리스트 11. 데이터베이스에서 워크시트 셀 가져오기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Importing worksheet cells from a database</title>
<style>
body {
font-family: Verdana;
}
</style>
</head>
<body>
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";
// create PDO connection
$dbh = new PDO('mysql:host=localhost;dbname=library', 'user', 'pass');
$sql = "SELECT title, author FROM library";
try {
// connect to API
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);
// set target spreadsheet and worksheet
$ssKey = 'ssid';
$wsKey = 'wsid';
// get results from database
// insert header row
$rowCount = 1;
$result = $dbh->query($sql, PDO::FETCH_ASSOC);
for ($x=0; $x<$result->columnCount(); $x++) {
$col = $result->getColumnMeta($x);
$service->updateCell($rowCount, ($x+1), $col['name'], $ssKey, $wsKey);
}
$rowCount++;
// insert each field of each row as a spreadsheet cell
// if large result set, increase PHP script execution time
foreach($result as $row) {
$colCount=1;
foreach ($row as $k=>$v) {
$service->updateCell($rowCount, $colCount, $v, $ssKey, $wsKey);
$colCount++;
}
$rowCount++;
}
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
?>
</body>
<html>
|
리스트 11 은 필수 클래스를 포함하고 Data API 신임 정보를 설정한다. 그런 다음, MySQL 데이터베이스에 대한 PDO 연결을 작성하고 작성자 및 제목 목록을 리턴하는 쿼리를 작성한다. 또한, Spreadsheets Data API에 연결하고 인증 연결을 만든다.
그 다음, 스크립트에서 PDO getColumnMeta() 메소드를 사용하여 결과 세트의 열 이름을 리턴하고, updateCell()
메소드를 사용하여 이들 열 이름을 스프레드시트에 헤더 행으로 쓴다. 그런 다음, 계속 진행하여 결과 세트 전체를 반복하여 각 필드를 스프레드시트에 별개의 셀로
쓰고 완료되면 다음 행으로 점프한다. 이런 식으로, 전체 결과 세트의 내용이 스프레드시트로 전송된다.
그림 13 은 Google Spreadsheets GUI의 결과를 나타낸 것이다.
그림 13. 데이터베이스 결과 세트에서 생성된 Google 스프레드시트
Google Spreadsheets Data API는 PHP 애플리케이션에서 Google Spreadsheet 클라우드의 데이터를 수정할 수 있게 해준다. 워크시트, 행 및 셀의 추가, 수정 및 삭제와 같은 공통 태스크가 모두 지원되고, 이런 작업은 Zend_Gdata를 사용하여 수행할 수 있다. 본 기사에서는 RSS 피드용 스프레드시트 가져오기 도구 및 데이터베이스 쿼리 결과의 두 예제 애플리케이션과 함께 이들 태스크의 예제를 모두 소개했다.
이러한 예제에서 알 수 있는 바와 같이 Google Spreadsheets Data API는 클라우드에서 스프레드시트 데이터와 관련된 창조적인 새로운 애플리케이션을 빌드하려는 개발자를 위한 강력하고 유연한 도구이다. Data API는 현재 개발 중이므로, 앞으로는 훨씬 더 흥미로운 기능이 추가될 것으로 기대된다.
교육
- Part 1: Integrate Google
Spreadsheets data with PHP(Vikram Vaswani, developerWorks, 2010년 12월): Google Spreadsheets는 잘 알려진 클라우드 기반 스프레드시트 애플리케이션이다. Google Spreadsheets Data API를 통해
온라인 스프레드시트에서 데이터를 액세스하고 검색해보자. 그런 다음, 스프레드시트 내용의 다양한 요소들을 검색하고 가져올 때 PHP 애플리케이션의 데이터를
사용해보자.
- Google 계정: 무료 계정을 등록하여 시작할 수 있다.
- Developer's Guide 및
Reference Guide: Google Spreadsheets Data API에 대해 자세히 알아보자.
- Google Data API authentication: 인증 방법에 대해 자세히 알아보고
어떤 것이 클라이언트에 최상인지 살펴보자.
- Google Apps APIs Help: Google Data API 개발과 관련된
토론에 참여하자.
- Google Apps Developer Blog: Google Spreadsheets 관련 뉴스를
접할 수 있다.
- Zend_Gdata_Spreadsheets component:
클라이언트 애플리케이션이 Google Data API 피드에서 스프레드시트 내용을 어떻게 보고 업데이트할 수 있는지 설명한 문서를 읽어보자.
- Zend_Feed component: RSS 및 Atom 피드를 사용하기
위한 Zend_Feed 기능에 대해 자세히 읽어보자. Zend_Feed는 피드, 피드 속성 및 항목 속성의 요소에 액세스하기 위한 기본 구문을 제공한다.
- 이 저자의 더 많은 기사(Vikram
Vaswani, developerWorks, 2007년 8월 현재): XML, 추가적인 Google API 및 기타 기술에 대한 기사를 읽을 수 있다.
- developerWorks의 XML 영역: XML 영역에서 기술 향상에 도움이 되는 참고자료를 얻을 수 있다.
- My developerWorks: developerWorks와 관련된 경험을 개인화할 수 있다.
- IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.
- XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다. 또한 더 많은 XML 팁을 읽어본다.
- developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.
- Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.
- developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
- developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.
제품 및 기술 얻기
- Zend 프레임워크: 더 안전하고 믿을 수 있는 현대식 Web 2.0 애플리케이션과 웹 서비스를 광범위하게 사용 가능한 API로 다운로드하고 빌드하자.
- IBM 제품 평가판: IBM SQA Sandbox의 온라인 시험판을 다운로드하거나 살펴보고 DB2®,
Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
토론
- XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.
- developerWorks 커뮤니티: 개발자가 운영하고 있는 블로그,
포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

Vikram Vaswani는 오픈 소스 도구 및 기술 분야를 전문으로 하는 컨설팅 서비스 회사인 Melonfire의 설립자이자 CEO이다. 그는 Zend Framework: A Beginners Guide와 PHP: A Beginners Guide의 저자이기도 하다