반응형
구글 폼을 여러 번 제출해야 하는 일이 생겼다. 제출하기 너무 너무 귀찮아서 구글 시트에 필요한 정보를 적어두면 자동으로 제출할 수 있도록 했다.
구글 폼 분석
제출을 어떻게 하는지 볼려고 테스트용 폼을 하나 만들었다. 제출하면 https://docs.google.com/forms/u/0/d/e/1FAIp/formResponse 이런 형식의 요청을 보내는 것을 알 수 있다. HTML도 찾아보면 폼의 각 입력마다 매핑된 input 요소가 있다. 개발자도구로 요청의 페이로드를 보면 entry.숫자 형식의 input 요소들을 전송하니까 어떤 input이 어떤 값을 담는지 확인하고 스크립트를 작성하면 된다.
제출 스크립트 작성(Apps Script)
구글 시트에서 사용할 수 있는 앱 스크립트는 자바스크립트와 비슷해서 사용하기 편했다. POST 요청은 UrlFetchApp.fetch 메서드를 사용하면 됐고, 구글 시트 조작은 SpreadsheetApp을 사용하면 쉽게 할 수 있었다. 내가 만든 스크립트를 예제로 첨부한다. POST 요청을 FORM 형태로 제출하는 예제다.
function submit(problemNumber) {
const url = '';
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const username = sheet.getRange('B1').getValue();
const track = sheet.getRange('B2').getValue();
const rawCode = sheet.getRange('B' + (5 + problemNumber)).getValue();
const github = sheet.getRange('B3').getValue();
const problemTitle = problemNumber + ' - ' + problems[problemNumber];
const {year, month, day} = getYearMonthDay();
const formData = {
'entry.770271090': username,
'entry.420774658': rawCode,
'entry.649430918': github,
'entry.1615397682': problemTitle,
'entry.1567117501_year': year,
'entry.1567117501_month': month,
'entry.1567117501_day': day,
'entry.1995668350': track
}
sendPostRequestWithFormData(url, formData);
sheet.getRange('C' + (5 + problemNumber)).setValue(1);
}
function getYearMonthDay() {
var today = new Date();
var year = today.getFullYear();
var month = today.getMonth() + 1;
var day = today.getDate();
return {
year: year,
month: month,
day: day
};
}
function sendPostRequestWithFormData(url, formData) {
var formPayload = Object.keys(formData).map(function(key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(formData[key]);
}).join('&');
var options = {
'method' : 'post',
'contentType': 'application/x-www-form-urlencoded',
'payload' : formPayload,
'muteHttpExceptions': true
};
try {
var response = UrlFetchApp.fetch(url, options);
var responseCode = response.getResponseCode();
if (responseCode == 200) {
Logger.log(formData['entry.1615397682'] + '제출 성공');
}
} catch (e){
Logger.log(e);
}
}
function main(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (var i=1; i<=218; i++){
if (sheet.getRange('B' + (i + 5)).getValue() != ''){
if (sheet.getRange('C' + (i + 5)).getValue() != '1'){
submit(i);
}
}
}
}
구글 시트
구글 시트에는 사용하기 편하게 만들어두고 스크립트에서 값을 설정하거나 얻거나 하면서 사용하면 된다. 스크립트를 실행하는 방법으로 시트에서 버튼과 스크립트의 메서드를 연결하는 방법, 트리거를 만들어서 일정 시간마다 실행하는 방법이 있다. 나는 버튼을 클릭하면 main 메서드가 실행되게 만들었다. 트리거는 없을 줄 알았는데 있어서 놀랐다. 설정도 쉽게 마우스 클릭으로 설정할 수 있다.
반응형
'Tool > Javascript' 카테고리의 다른 글
[Javascript] 목차 추가 기능을 만들었다 (0) | 2023.10.16 |
---|