javascript - 使用 Google App Script 修改 Google Sheet 中的单元格
问题描述
我是谷歌应用脚本的初学者。我正在创建一个常驻支付系统,用户可以在登录时更改密码。所以现在,我已经完成了更改密码的 html 部分,但我不知道如何进行编码以更改密码。我附上了一些图片和我的代码来更好地解释自己。十分感谢大家。
https://script.google.com/macros/s/AKfycbw_A-XRlXtR9qGNvMKVrorMIg71hwHt0DrHRiNGVYZdURbadYgUtOIkJPsvuYsBK7Fe/exec - 链接到 Web 应用程序
Code.gs 的代码
var url = "https://docs.google.com/spreadsheets/d/1bM8l6JefFsPrlJnTWf56wOhnuSjdIwg3hMbY1tN1Zp8/edit#gid=1775459006";
var streetSheetName = "JALAN SANGGUL 4";
function doGet(e) {
var streetSheetName = "JALAN SANGGUL 4"; // Added
PropertiesService.getScriptProperties().setProperty("streetSheetName", streetSheetName); // Added
return HtmlService.createHtmlOutputFromFile('WebAppLogin');
}
function checkLogin(username, password) {
var found_record = '';
var name = '';
var ss = SpreadsheetApp.openByUrl(url);
var webAppSheet = ss.getSheetByName("USERNAMES");
var getLastRow = webAppSheet.getLastRow();
for(var i = 2; i <= getLastRow; i++) {
if(webAppSheet.getRange(i, 1).getValue().toUpperCase() == username.toUpperCase() && webAppSheet.getRange(i, 7).getValue() == password) {
found_record = 'TRUE';
name = webAppSheet.getRange(i, 4).getValue().toUpperCase() + " " + webAppSheet.getRange(i, 5).getValue().toUpperCase();
streetSheetName = webAppSheet.getRange(i, 3).getValue().toUpperCase();
} else if (username.toUpperCase() == 'ADMIN' && password == 'ADMINPASSWORD') {
found_record = 'TRUE';
name = webAppSheet.getRange(i, 4).getValue().toUpperCase() + " " + webAppSheet.getRange(i, 5).getValue().toUpperCase();
streetSheetName = webAppSheet.getRange(i, 3).getValue().toUpperCase();
}
}
PropertiesService.getScriptProperties().setProperty("streetSheetName", streetSheetName); // Added
if(found_record == '') {
found_record = 'FALSE';
}
return [found_record, username,name];
}
function GetRecords(username,filter) {
var filteredDataRangeValues = GetUsernameAssociatedProperties(username);
var resultArray = GetPaymentRecords(filteredDataRangeValues,filter);
return resultArray;
}
function GetUsernameAssociatedProperties(username) {
var filteredDataRangeValues = '';
var ss = SpreadsheetApp.openByUrl(url);
var displaySheet = ss.getSheetByName("USERNAMES");
var dataRangeValues = displaySheet.getDataRange().getValues();
if (username.toUpperCase() == 'ADMIN') {
dataRangeValues.shift();
filteredDataRangeValues = dataRangeValues;
} else {
filteredDataRangeValues = dataRangeValues.filter(row => row[0].toUpperCase() == username.toUpperCase());
}
return filteredDataRangeValues;
}
function GetPaymentRecords(userProperties,filter) {
var streetSheetName = PropertiesService.getScriptProperties().getProperty("streetSheetName"); // Added
var transpose = m => m[0].map((_, i) => m.map(x => x[i]));
var resultArray = [];
var ss = SpreadsheetApp.openByUrl(url);
var displaySheet = ss.getSheetByName(streetSheetName);
var addressValues = displaySheet.getRange("B:C").getValues();
var paidMonthValues = displaySheet.getRange(1, 7, displaySheet.getLastRow(), displaySheet.getLastColumn() - 6).getValues();
//Logger.log(addressValues);
//Logger.log(transpose(paidMonthValues));
userProperties.forEach((v, i) => {
var userHouseNumber = v[1];
var userStreet = v[2];
var column = addressValues.reduce(function callbackFn(accumulator, currentValue, index, array) {
if (currentValue[0] == userHouseNumber && currentValue[1] == userStreet) {
return index
} else {
return accumulator
}
}, '');
//Logger.log(column);
Logger.log(filter)
Logger.log(paidMonthValues);
if(filter=="None"){
var result = transpose(paidMonthValues).map(function callbackFn(element, index, array) {
return [element[0], userHouseNumber, userStreet, element[column] || '']
});
}else{
var result = transpose(paidMonthValues).map(function callbackFn(element, index, array) {
if(element[0].includes(filter))return [element[0], userHouseNumber, userStreet, element[column] || '']
});
}
resultArray = resultArray.concat(result);
//Logger.log(resultArray);
})
//Remove null elements
resultArray = resultArray.filter(element=>{
Logger.log(element!=null)
return element != null;
});
return resultArray;
}
WebAppLogin.html 的代码
function changePassword(){
var result = confirm("Want to Change Password?");
if (result) {
google.script.run
.withSuccessHandler(updateButton)
.getEmail()
alert('Password changed');
}
解决方案
我相信你的目标如下。
- 单击“更改密码”按钮并输入值并单击“保存更改”时,您要更改电子表格中的密码。
修改点:
- 在您的脚本中,当单击“保存更改”按钮时,它似乎
google.script.run.withSuccessHandler(updateButton).getEmail()
正在运行。但是,不幸的是,在您的脚本中,没有updateButton
and的功能getEmail
。由此,发生错误。 - 当我看到您共享的示例电子表格时,您的示例电子表格似乎与您图像的示例电子表格不同。例如,工作表“USERNAMES”的“A”列不同。在您共享的电子表格中,“A”列是
4
。- 从这种情况,从您对 的回复中
it just the same you can notice it now yesterday I mistaken changed it in to 4 sorry about that.
,我了解到工作表“USERNAMES”的“A”列是“USERNAME”。
- 从这种情况,从您对 的回复中
- 关于
updateButton
,在这个答案中,alert('Password changed')
作为样本运行。 - 为了更新电子表格的密码,需要使用用户名和输入的密码。并且,还需要在 Google Apps Script 端准备函数。
当以上几点反映到您的脚本时,它变成如下。
Javascript方面:
从:
function GetRecords() {
var spin = "<span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>";
spin += " Loading...";
document.getElementById("LoginButton").innerHTML = spin;
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
至:
var username = ""; // Added
function GetRecords() {
var spin = "<span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>";
spin += " Loading...";
document.getElementById("LoginButton").innerHTML = spin;
username = document.getElementById("username").value; // Modified
var password = document.getElementById("password").value;
并且,请changePassword()
进行如下修改。
function changePassword(){
var result = confirm("Want to Change Password?");
if (result) {
var newPassword = document.getElementById("newPassword").value;
google.script.run.withSuccessHandler(() => alert('Password changed')).changePassword(username, newPassword);
}
}
Google Apps 脚本方面:
请将以下函数添加到 Google Apps 脚本端。
function changePassword(username, newPassword) {
var sheet = SpreadsheetApp.openByUrl(url).getSheetByName("USERNAMES");
var range = sheet.getRange("A2:A").createTextFinder(username).matchEntireCell(true).findNext();
if (range) {
range.offset(0, 6).setValue(newPassword);
}
}
笔记:
- 在这种情况下,当更改密码时,可以看到“密码已更改”的提示。并且,表“USERNAMES”的“G”列被改变。
推荐阅读
- flutter - 为什么在 Flutter/Android 客户端上使用 FCM 服务器密钥是不好的做法?
- python - 如何在 Database-Python 中检查对象存在()
- c++ - C++解析表达式,分解求值顺序
- javascript - 如何解决出现在控制台中的非布尔属性`spy`的警告:收到`true`?
- laravel - 无法使用 Laravel Mix 导入 Video.js
- python - 如何获得pytorch网络中每个输入的多个输出的梯度?
- c# - 如何在函数应用程序中更改 local.settings.json 文件中的值
- r - “活”预测线和CI丝带成动画
- javascript - 如果它是Javascrict中的正整数,我如何在求和之前检查json数据
- python - 烧瓶缓存删除以特定字符串开头的键