괴도군의 블로그

[SERVER] 구글 스프레드시트를 서버로 이용하기 2탄 : 웹설정 본문

#프로그래밍/테스트..

[SERVER] 구글 스프레드시트를 서버로 이용하기 2탄 : 웹설정

괴도군 2016. 11. 23. 23:06
반응형




안녕하세요 괴도입니다.

구글 스프레드시트의 스크립트를 통해 데이터베이스처럼 이용하는 예제를 시작하겠습니다.

예제는 스팸차단어플입니다. 아래와 같이 스팸목록을 모든 사용자가 추가하고

공유하는 구조입니다.


https://docs.google.com/spreadsheets

먼저 위 주소로 접속하여 사용할 시트를 생성합니다.

더하기 버튼을 누르면 새 시트가 생성됩니다.


시트를 새로 생성하게 되면 제목이 없습니다. 제목부터 설정해주세요. 

예제에서 사용할 데이터 키인 number와 reason을 A1과 B1에 입력해주세요


편의에 따라서 임의의 데이터를 입력해주셔도 됩니다.

그리고 스크립트 편집기를 선택해줍니다.


아래 코드를 붙여넣고 저장을 해주세요


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//  1. Enter sheet name where data is to be written below
        var SHEET_NAME = "spamsheet";
         
//  2. Run > setup
//
//  3. Publish > Deploy as web app
//    - enter Project Version name and click 'Save New Version'
//    - set security level and enable service (most likely execute as 'me' and access 'anyone, even anonymously)
//
//  4. Copy the 'Current web app URL' and post this in your form/script action
//
//  5. Insert column names on your destination sheet matching the parameter names of the data you are passing in (exactly matching case)
 
var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service
 
// If you don't want to expose either GET or POST methods you can comment out the appropriate function
function doGet(e){
  return setResponse(e);
}
 
function doPost(e){
  return handleResponse(e);
}
 
function setResponse(e) {
  
  var lock = LockService.getPublicLock();
  lock.waitLock(30000);  // wait 30 seconds before conceding defeat.
   
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
    var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var sheet = doc.getSheetByName(SHEET_NAME);
    
    var line = sheet.getLastRow();
    
    var data = new Array();
    for(var j=2;j<=line;j++){
        var values = sheet.getRange(j, 11,sheet.getLastColumn()).getValues();
        var info = new Object();
        info.number = values[0][0];
        info.reason = values[0][1];
      
      data.push(info);
      info = null;
    }
    
    var total = new Object();
    total.list = data; 
    
    } catch(e){
    // if error return this
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error""error": e}))
          .setMimeType(ContentService.MimeType.JSON);
  } finally { //release lock
    lock.releaseLock();
  }
  
 return ContentService
          .createTextOutput(JSON.stringify(total))
          .setMimeType(ContentService.MimeType.JSON);
}
 
function handleResponse(e) {
  // shortly after my original solution Google announced the LockService[1]
  // this prevents concurrent access overwritting data
  // [1] http://googleappsdeveloper.blogspot.co.uk/2011/10/concurrency-and-google-apps-script.html
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(30000);  // wait 30 seconds before conceding defeat.
   
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
    var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var sheet = doc.getSheetByName(SHEET_NAME);
    
    var key = null;
    var keyNumber = null;
    var keyReason = null;
    try{
      key = e.parameter["modify"];
      keyNumber = e.parameter["number"];
      keyReason = e.parameter["reason"];
    } catch(e){
    }
    
    if(key != null){//수정일 경우
      var line = sheet.getLastRow();
      
      for(var j=2;j<=line;j++){
        var values = sheet.getRange(j, 11,sheet.getLastColumn()).getValues()[0];
        var number = values[0];
        var reason = values[1];
        
        if(number == keyNumber & reason != keyReason){
          sheet.getRange(j,2,1).setValue(keyReason);
          
          return ContentService
      .createTextOutput(JSON.stringify({"result":"success"}))
      .setMimeType(ContentService.MimeType.JSON);
        }
    }
      return ContentService
      .createTextOutput(JSON.stringify({"result":"false"}))
      .setMimeType(ContentService.MimeType.JSON);
       
      
    } else {//수정이 아닐경우
      
      // we'll assume header is in row 1 but you can override with header_row in GET/POST data
      var headRow = e.parameter.header_row || 1;
      var headers = sheet.getRange(111, sheet.getLastColumn()).getValues()[0];
      var nextRow = sheet.getLastRow()+1// get next row
      var row = [];
      // loop through the header columns
      for (var i =0;i<2;i++){
        if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
          row.push(new Date());
        } else { // else use header name to get data
          row.push(e.parameter[headers[i]]);
        }
      }
      // more efficient to set values as [][] array than individually
      sheet.getRange(nextRow, 11, row.length).setValues([row]);
      // return json success results
      return ContentService
      .createTextOutput(JSON.stringify({"result":"success""row": nextRow}))
      .setMimeType(ContentService.MimeType.JSON);
    }
      
    } catch(e){
      // if error return this
      return ContentService
      .createTextOutput(JSON.stringify({"result":"error""error": e}))
      .setMimeType(ContentService.MimeType.JSON);
    } finally { //release lock
      lock.releaseLock();
    }
  
  
}
 
function setup() {
    var doc = SpreadsheetApp.getActiveSpreadsheet();
    SCRIPT_PROP.setProperty("key", doc.getId());
}
cs


아래 스크린샷과 같이 시트이름을 바꾸시거나

var SHEET_NAME = "spamsheet";

위 스크립트에서 이부분을 원하는 시트이름으로 바꿔주세요.


그리고 setup함수를 실행시켜줍니다.

아래와 같이 인증을 받게됩니다.

권한검토를 누르시고 계속 진행해주세요

그리고 웹앱으로 배포를 시작합니다.


버전은 마음대로 설정하시고 앱을 실행할 사용자는 "나"

웹에 액세스 할 수 있는 사용자는 누구나(익명 사용자 포함) 으로 설정하고 업데이트를 눌러주세요

배포가 되었으면 웹앱URL을 복사해주세요


아래는 HTTP통신 테스트도구입니다. 구글 플러그인중 하나인 ARC입니다.

보통 유명한 POST MAN을 사용하시는데 저는 그냥 쓰던걸 씁니다..ㅎㅎ

자세한건 다음 포스팅에서 다루겠습니다~

위 플러그인을 통해 간단하게 HTTP통신을 테스트 해볼수있습니다.

[Android] GCM HTTP 테스트하기 / 구현하기 (2016 최신)

예전에 썼던 GCM(구글 클라우드 메시징) HTTP를 통해 테스트하는걸 다루기도 했죠

물론 GCM전용 테스트사이트들도 많이 있기도합니다


아무튼.. 위 스크립트에 구현해논대로 

HTTP POST방식으로 Content-type과 charset정도를 넣고 데이터를 key와 value로 넣어주고 보내면!

아래와 같이 시트에 저장되는걸 보실수 있습니다.

(엑셀이라서 숫자를 넣을땐 `기호를 넣어줘야합니다..)


값을 꺼내오는것은 GET으로 구현해놓았습니다.


JSON형식으로 잘나오네요~

예제의 대한 자세한 설명과 앱에서 어떻게 연동하는지에 대해서는 다음 포스팅에서 다루도록 하겠습니다~


반응형
Comments