Обновлено с фрагментами и текущим прогрессом:
Я пишу расширение Chrome, которое представляет собой всплывающее окно с формой, и я хотел бы записать данные, введенные в эту форму, в Google Sheets. В настоящее время мое расширение состоит из manifest.json, всплывающего скрипта и фонового скрипта.
manifest.json (соответствующие части):
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_scripts": [{ "js": ["content.js"], "matches": ["<all_urls>"] }],
"permissions": [
"tabs",
"storage",
"<all_urls>",
"identity",
"https://*.googleapis.com/*"
]
popup.js (примечание: это расширение для отслеживания симптомов MS)
const app = {
symptoms: [],
init: function () {
//cache some element references
let formEl = document.getElementById("symptoms-form");
let fatigue = document.getElementById("fatigue");
let tingling = document.getElementById("tingling");
let weakness = document.getElementById("weakness");
let vision = document.getElementById("vision");
let dizzy = document.getElementById("dizzy");
let cognition = document.getElementById("cognition");
let depression = document.getElementById("depression");
let balance = document.getElementById("balance");
//upon submit, update symptoms obj and send to background
formEl.addEventListener("submit", ev => {
ev.preventDefault();
console.log('button click')
this.symptoms.push({fatigue: fatigue.value})
this.symptoms.push({tingling: tingling.value})
this.symptoms.push({weakness: weakness.value})
this.symptoms.push({vision: vision.value})
this.symptoms.push({dizzy: dizzy.value})
this.symptoms.push({cognition: cognition.value})
this.symptoms.push({depression: depression.value})
this.symptoms.push({balance: balance.value})
// chrome.runtime.sendMessage({fn: 'getSymptoms'}, function(response) {
// console.log('popup got response', response)
// })
chrome.runtime.sendMessage({fn: 'setSymptoms', symptoms: this.symptoms})
});
}
}
document.addEventListener('DOMContentLoaded', () => {
app.init();
})
background.js - примечание: мой обходной путь - загрузить данные в Firebase, что вы увидите ниже:
console.log("Background running");
const background = {
symptoms: [],
init: function() {
//listen for any messages and route them to functions
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.fn in background) {
background[request.fn](request, sender, sendResponse);
}
const jsonObj = {}
jsonObj['symptoms'] = request.symptoms
console.log("message received", jsonObj);
this.postSymptoms(jsonObj)
});
},
postSymptoms: function(msg) {
const xhr = new XMLHttpRequest();
xhr.open("POST", "https://ms-mysymptoms-1541705437963.firebaseio.com/symptoms.json", true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(msg);
}
};
background.init();
Я настроил новый проект в консоли разработчиков Google, включил API Google Sheets и настроил свои учетные данные и токен API. Я проверил в проводнике Google API, что аутентификация настроена правильно, и я действительно могу написать строку на своем листе. Это отличная новость!
Я сейчас заблокирован, как это сделать (записать данные), прямо из моего расширения Chrome. До сих пор я сохранил все свои учетные данные, настроил файл конфигурации и записал свой метод append
в отдельный файл локально.
sheets.js:
const {authorize, google} = require('./config')
const fs = require('fs')
const spreadsheetId = '---removed for this post--'
const append = (range, values) => {
fs.readFile('client_secret.json', (err, content) => {
if (err) return console.log('Error loading client secret file:', err);
// Authorize a client with credentials, then call the Google Sheets API.
authorize(JSON.parse(content), (auth) => {
const sheets = google.sheets({
version: 'v4',
auth
});
const valueInputOption = 'USER_ENTERED';
const resource = {
values
};
sheets.spreadsheets.values.append({
spreadsheetId,
range,
valueInputOption,
resource
}, (err, result) => {
if (err) {
console.log(err);
} else {
console.log("Success!");
}
});
});
});
}
// module.exports = {
// append
// };
Однако, когда я пытаюсь интегрировать этот код в мой всплывающий скрипт, я сталкиваюсь с ошибкой, потому что для ссылки на эти данные конфигурации и этот метод добавления я должен использовать require
в своем всплывающем скрипте. Поскольку в браузере работает всплывающий скрипт, я не могу использовать require
(без веб-пакета, то есть).
Я уверен, что я все делаю неправильно, поэтому я мог использовать толчок в правильном направлении, чтобы выполнить аутентификацию и добавление к листам из браузера, если моя конфигурация и аутентификация хранятся в локальных файлах на моем компьютер.
Решения, которые я рассмотрел:
1 - раскрутить API REST, отправить данные из формы на эту конечную точку и заставить их выступать в качестве прокси для API Google Sheets - это не идеально.
2 - используйте веб-пакет, чтобы я мог использовать require
в моем всплывающем файле
Какой рекомендуемый способ сделать это? Как мне интегрировать аутентификацию и работу с Google Sheet в это расширение?