google form으로 응답하면 GAS를 사용하여 firebase와 연동하여 자동 생성 된 ID가있는 문서의 데이터를 다시 씁니다.
자동 생성 된 문서의 ID (무작위 문자열 ID)
라이브러리 "FirestoreApp"에서 꺼낼 수 없었기 때문에, 그쪽에 대해서 특히 남겨 두고 싶고 쓰고 있습니다.
손잡이 포인트:
GAS에서 이번 라이브러리 "FirestoreApp"에서 where를 사용하는 곳까지는 할 수 있었지만,
그 후, 통상 firebase로 쓰는 쓰는 방법에서는, 랜덤인 문자열의 ID를 꺼내지 않고 고민했다.
※통상의 firebase로 사용하는 「where」를 사용한 쓰는 방법에서는,
자동 생성된 문서의 ID(무작위 문자열의 ID)를 검색할 수 없습니다.
이번에는 : Cloud Firestore에서 컬렉션의 문서 ID를 자동 생성합니다.
1) Cloud Firestore 안에 "hoges"컬렉션이 존재한다.
2) hoges 컬렉션 중에는 「ID가 자동으로 할당된 랜덤한 문자열」의 문서가 다수 있다.
3) hoges 컬렉션의 각 문서는 키 "hogeID"로 값을가집니다.
하고 싶은 것:
google form에서 제출하여 'fugaID'로 받은 값과,
자동 생성된 랜덤 ID를 가지는 각 문서안에 있는 「hogeID」의 값이 일치했을 때,
문서의 키 "answerd1""answerd2"와 같은 값을 다시 작성하고 싶습니다.
Google 양식 준비
google 양식을 만듭니다.
htps //w w. 오, ぇ. 코 m/인 tl/자_jp/후우 rms/아보 t/
만들면
오른쪽 상단의 "..."에서 "스크립트 편집기"를 엽니다.
※스프레드시트와의 제휴는 이 기사에는 쓰지 않는다. 다른 기사가 많기 때문에 할애.
이번은 폼에서의 송수신이 발생했을 때에, firebase상의 임의의 값이 재기록되도록 한다.
Google Forms 스크립트 편집기로 GAS 작성
라이브러리 추가
GAS 라이브러리에 Firestore와 연결하여 데이터를 쓰는 라이브러리를 추가합니다.
이번에는 'FirestoreApp'이라는 라이브러리를 사용한다.
htps : // 기주 b. 이 m / g 등은 메아 r ぇ y / 흠 s
왼쪽의 "라이브러리"에서
1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw
라는 ID로 검색하여 "FirestoreApp"의 최신 버전을 추가.
firebase와의 협력
firebase와 연계하기 위한 정보를 GAS에 기재한다.
Google Service Accounts에서 키를 만들고 가져오기
Google Service Accounts page의 '서비스 계정'에서
htps : // 이런. cぉd. 오, ぇ. 코 m / p 로지 ぇ c ぇ ぇ c와 r / 어 m 아 d 민 / 세 r
1) Firebase 프로젝트를 선택
2) "서비스 계정 생성"
3) 서비스 계정 이름, 서비스 계정 ID 입력 -> 생성
4) 역할 -> Cloud Datastore 소유자 선택 -> 계속
5) 사용자 역할, 관리자 역할은 특별히 설정하지 않아도 OK-> 완료
6) 작성한 서비스 어카운트로부터 「키를 작성」-> 키의 타입은 "JSON"으로 해 로컬에 보존.
DL 한 키의 json 파일에서 필요한 정보를 GAS에 씁니다.
사용하기 전에 DL 한 키 중project_id
private_key
client_email
의 3개.
이것들을 google form의 스크립트 편집기에 아래와 같이 씁니다.
// CloudFirestoreで認証する為の情報
function firestoreDate() {
var dateArray = {
'email': 'xxxxxxxxxxxx@xxxxxxxxxxxxxx',
'key': '-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxx\n-----END PRIVATE KEY-----\n',
'projectId': 'xxxxxxxxxxxxxxxxxxx'
}
return dateArray;
}
양식에서 보낸 응답 문자열과 컬렉션의 각 문서에서 "임의 키"의 "값"이 일치하면 문서 ID (무작위로 생성 된 문자열 ID)를 얻습니다. → 문서 '다른 키'의 '값' 변경
계속해서 앞서 쓴 firestoreDate 아래에,
이하와 같이 「폼이 송신되면 실행하고 싶은 스크립트」를 기재한다.
async function submitForm(e){
var itemResponses = e.response.getItemResponses();
// ここにフォームから取得したい回答の値が入る。今回は仮で数字が入る。
// フォームの質問の1つめの値が入る。
const num = itemResponses[0].getResponse();
// ここにフォームから取得したい回答の値が入る。今回は仮でID(文字列)が入る。
// フォームの質問の2つめの値が入る。
const fugaID = itemResponses[1].getResponse();
// CloudFirestoreの認証。(上で記載したfirestoreDateを実行している。)
var dateArray = firestoreDate();
var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);
// fugaIDと一致するdocIDの取得
/*
ここでつまずいた。
通常のwhereの書き方で書けない。
フォームから送られてきた回答の文字列と、IDが自動生成されているドキュメントの「任意のキー」の「値」が一致したら、
「ドキュメントのID(自動生成された文字列)」を取得する。
※splitで返ってきた文字列をバラバラにして最後尾につくIDの文字列を取得した。
*/
const ref = await firestore.query('hoges').Where('hogeId', '==', fugaID).Execute();
const splitText = ref[0].name.split('/')
const splitLenght = ref[0].name.split('/').length
const docId = splitText[splitLenght - 1]
console.log('docId',docId);
// 更新するobjectのキー
const answerdNum = `answerd${num}`;
// 更新するデータ
/*
今回はドキュメント内にある「answerd1」「answerd2」などの値をtrueにする。
*/
const data = {
[answerdNum] : true
}
// CloudFirestoreをドキュメント更新
firestore.updateDocument(`hoges/${docId}`, data, true);
}
덧붙여 : google form의 질문의 값으로부터, 응답의 값을 가져오는 경우는 이런 느낌
let num="";
let fugaID="";
var itemResponses = e.response.getItemResponses();
for (var i = 0; i < itemResponses.length; i++) {
var itemResponse = itemResponses[i];
var question = itemResponse.getItem().getTitle();
var answer = itemResponse.getResponse();
if (question === '質問に入れた文字列'){
num = answer;
}
if (question === '質問に入れた文字列'){
fugaID = answer;
}
}
왜냐하면 for내의 var는 var가 아니면 움직이지 않았다… 왜.
'양식이 제출되면 실행'이라는 조건 추가
google form의 스크립트 편집기 왼쪽 시계 아이콘에서,
양식이 제출되면 'submitForm' 실행
라는 조건을 추가한다.
참고로 한 기사 🙏 :
GAS(Google Apps Script)에서 Cloud Firestore를 사용할 때의 메모
htps : // 이 m / P 만락 t / ms / 76b9bc5 9d0239c9f78
【서적 관리 시리즈】GAS와 FireBase(Firestore)를 연계시켜라!
htps : // 이 m / h_p ㎅ / ms / f6 16931f955d33158
GAS: SpreadSheet에 등록한 데이터를 Firestore로 전송
htps : // 이 m/설마-321/있어 ms/86에 356b02dcf5b840595
더 현명한 방법이 있다면 꼭 알려주세요 🙏
Reference
이 문제에 관하여(google form으로 응답하면 GAS를 사용하여 firebase와 연동하여 자동 생성 된 ID가있는 문서의 데이터를 다시 씁니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/AyakoKataoka/items/8d1a065f903b82516cbf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
라이브러리 추가
GAS 라이브러리에 Firestore와 연결하여 데이터를 쓰는 라이브러리를 추가합니다.
이번에는 'FirestoreApp'이라는 라이브러리를 사용한다.
htps : // 기주 b. 이 m / g 등은 메아 r ぇ y / 흠 s
왼쪽의 "라이브러리"에서
1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw
라는 ID로 검색하여 "FirestoreApp"의 최신 버전을 추가.
firebase와의 협력
firebase와 연계하기 위한 정보를 GAS에 기재한다.
Google Service Accounts에서 키를 만들고 가져오기
Google Service Accounts page의 '서비스 계정'에서
htps : // 이런. cぉd. 오, ぇ. 코 m / p 로지 ぇ c ぇ ぇ c와 r / 어 m 아 d 민 / 세 r
1) Firebase 프로젝트를 선택
2) "서비스 계정 생성"
3) 서비스 계정 이름, 서비스 계정 ID 입력 -> 생성
4) 역할 -> Cloud Datastore 소유자 선택 -> 계속
5) 사용자 역할, 관리자 역할은 특별히 설정하지 않아도 OK-> 완료
6) 작성한 서비스 어카운트로부터 「키를 작성」-> 키의 타입은 "JSON"으로 해 로컬에 보존.
DL 한 키의 json 파일에서 필요한 정보를 GAS에 씁니다.
사용하기 전에 DL 한 키 중
project_id
private_key
client_email
의 3개.이것들을 google form의 스크립트 편집기에 아래와 같이 씁니다.
// CloudFirestoreで認証する為の情報
function firestoreDate() {
var dateArray = {
'email': 'xxxxxxxxxxxx@xxxxxxxxxxxxxx',
'key': '-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxx\n-----END PRIVATE KEY-----\n',
'projectId': 'xxxxxxxxxxxxxxxxxxx'
}
return dateArray;
}
양식에서 보낸 응답 문자열과 컬렉션의 각 문서에서 "임의 키"의 "값"이 일치하면 문서 ID (무작위로 생성 된 문자열 ID)를 얻습니다. → 문서 '다른 키'의 '값' 변경
계속해서 앞서 쓴 firestoreDate 아래에,
이하와 같이 「폼이 송신되면 실행하고 싶은 스크립트」를 기재한다.
async function submitForm(e){
var itemResponses = e.response.getItemResponses();
// ここにフォームから取得したい回答の値が入る。今回は仮で数字が入る。
// フォームの質問の1つめの値が入る。
const num = itemResponses[0].getResponse();
// ここにフォームから取得したい回答の値が入る。今回は仮でID(文字列)が入る。
// フォームの質問の2つめの値が入る。
const fugaID = itemResponses[1].getResponse();
// CloudFirestoreの認証。(上で記載したfirestoreDateを実行している。)
var dateArray = firestoreDate();
var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);
// fugaIDと一致するdocIDの取得
/*
ここでつまずいた。
通常のwhereの書き方で書けない。
フォームから送られてきた回答の文字列と、IDが自動生成されているドキュメントの「任意のキー」の「値」が一致したら、
「ドキュメントのID(自動生成された文字列)」を取得する。
※splitで返ってきた文字列をバラバラにして最後尾につくIDの文字列を取得した。
*/
const ref = await firestore.query('hoges').Where('hogeId', '==', fugaID).Execute();
const splitText = ref[0].name.split('/')
const splitLenght = ref[0].name.split('/').length
const docId = splitText[splitLenght - 1]
console.log('docId',docId);
// 更新するobjectのキー
const answerdNum = `answerd${num}`;
// 更新するデータ
/*
今回はドキュメント内にある「answerd1」「answerd2」などの値をtrueにする。
*/
const data = {
[answerdNum] : true
}
// CloudFirestoreをドキュメント更新
firestore.updateDocument(`hoges/${docId}`, data, true);
}
덧붙여 : google form의 질문의 값으로부터, 응답의 값을 가져오는 경우는 이런 느낌
let num="";
let fugaID="";
var itemResponses = e.response.getItemResponses();
for (var i = 0; i < itemResponses.length; i++) {
var itemResponse = itemResponses[i];
var question = itemResponse.getItem().getTitle();
var answer = itemResponse.getResponse();
if (question === '質問に入れた文字列'){
num = answer;
}
if (question === '質問に入れた文字列'){
fugaID = answer;
}
}
왜냐하면 for내의 var는 var가 아니면 움직이지 않았다… 왜.
'양식이 제출되면 실행'이라는 조건 추가
google form의 스크립트 편집기 왼쪽 시계 아이콘에서,
양식이 제출되면 'submitForm' 실행
라는 조건을 추가한다.
참고로 한 기사 🙏 :
GAS(Google Apps Script)에서 Cloud Firestore를 사용할 때의 메모
htps : // 이 m / P 만락 t / ms / 76b9bc5 9d0239c9f78
【서적 관리 시리즈】GAS와 FireBase(Firestore)를 연계시켜라!
htps : // 이 m / h_p ㎅ / ms / f6 16931f955d33158
GAS: SpreadSheet에 등록한 데이터를 Firestore로 전송
htps : // 이 m/설마-321/있어 ms/86에 356b02dcf5b840595
더 현명한 방법이 있다면 꼭 알려주세요 🙏
Reference
이 문제에 관하여(google form으로 응답하면 GAS를 사용하여 firebase와 연동하여 자동 생성 된 ID가있는 문서의 데이터를 다시 씁니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/AyakoKataoka/items/8d1a065f903b82516cbf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)