【问题标题】:Modify a cell in Google Sheet using Google App Script使用 Google App Script 修改 Google Sheet 中的单元格
【发布时间】:2021-05-20 08:57:58
【问题描述】:

我是谷歌应用脚​​本的初学者。我正在创建一个常驻支付系统,用户可以在登录时更改密码。所以现在,我已经完成了更改密码的 html 部分,但我不知道如何进行编码以更改密码。我附上了一些图片和我的代码来更好地解释自己。非常感谢你们。

https://docs.google.com/spreadsheets/d/1bM8l6JefFsPrlJnTWf56wOhnuSjdIwg3hMbY1tN1Zp8/edit#gid=1775459006 - 链接到谷歌表格

https://script.google.com/macros/s/AKfycbw_A-XRlXtR9qGNvMKVrorMIg71hwHt0DrHRiNGVYZdURbadYgUtOIkJPsvuYsBK7Fe/exec - 链接到网络应用程序

https://script.google.com/d/1DdRKqUX__-ZITUgTZanQ_A7hUL1kcc0TZOeFmn58wYsX_o_7cqNExnYo/edit?usp=sharing - 链接到应用脚本

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');
      }

【问题讨论】:

  • 我没有浏览你所有的代码,因为它太长了,但我猜你想通过客户端函数changePassword来处理这个。如果是这种情况,您应该在changePassword 中调用一个服务器端函数来更改工作表中的密码值。在您的代码中,您调用的函数getEmail 在代码中的任何位置都不存在,而作为成功处理程序,您调用的是updateButton,我也没有在任何地方看到它。你能澄清一下吗?另外,我建议您提供一个最小的重现示例,以便专注于您的实际问题。
  • @Iamblichus Bro 非常感谢您的回复。我真的需要你的帮助兄弟。我在我的帖子中更新了一些东西兄弟。希望它能让你更好地理解。我想让用户在登录后更改密码兄弟。但我不太确定如何进行编码。希望你能帮助我。 用户名:JJACKSON 密码:PASSWORD1您可以使用此凭据登录网络应用程序兄弟。
  • 当我看到您共享的示例电子表格时,您的示例电子表格似乎与您图像的示例电子表格不同。例如,工作表“USERNAMES”的“A”列不同。在您共享的电子表格中,“A”列是4。这个怎么样?还有,Javascript 端 .withSuccessHandler(updateButton) 的函数 updateButton 是什么?
  • @Tanaike Bro 和你昨天看到的一样,我错误地把它改成了 4 对不起。
  • 感谢您的回复。根据您的回复, 1. 工作表“USERNAMES”的“A”列是“USERNAME”。我的理解正确吗? 2. 关于.withSuccessHandler(updateButton),我仍然无法理解。我为我糟糕的英语水平道歉。我可以问你.withSuccessHandler(updateButton)目标的细节吗?例如,alert('Password changed') 显示在函数 updateButton?

标签: javascript html google-apps-script


【解决方案1】:

我相信你的目标如下。

  • 单击“更改密码”按钮并输入值并单击“保存更改”时,您要更改电子表格中的密码。

修改点:

  • 在您的脚本中,当单击“保存更改”按钮时,似乎正在运行google.script.run.withSuccessHandler(updateButton).getEmail()。但是,不幸的是,在您的脚本中,没有updateButtongetEmail 的功能。这样,就会发生错误。
  • 当我看到您共享的示例电子表格时,您的示例电子表格似乎与您图像的示例电子表格不同。例如,工作表“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”列已更改。

【讨论】:

  • 非常感谢你和我在一起,兄弟。我不知道如何感谢你实际上非常感谢兄弟。我真的很感谢你对我的帮助兄弟。在我完成所有事情后,我一定会通知你最终的输出兄弟。最后,兄弟,我发誓我不会再惹你生气了,我保证。我有一个关于如何在谷歌工作表中添加一行的问题,我真的希望你能帮我一把。非常感谢你和我在一起
  • stackoverflow.com/questions/67640822/… - 对不起兄弟。你能看一下帖子并帮助我兄弟。我真的很感谢你的帮助兄弟。谢谢兄弟
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2020-09-20
  • 2022-11-09
  • 1970-01-01
相关资源
最近更新 更多