使用宏脚本检查工作表字段是否存在某些数据

问题描述 投票:0回答:1

工作表中的宏脚本专家帮助我编写代码。我在宏脚本中尝试过这种方法

var sheetName = 'records';
var scriptProp = PropertiesService.getScriptProperties();

function intialSetup() {
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  scriptProp.setProperty('key', activeSpreadsheet.getId());
}

function usernameExists(username) {
  var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'));
  var sheet = doc.getSheetByName(sheetName);
  var dataToCheck = username.toLowerCase();

  var values = sheet.getRange("A:A").getValues();

  for (var i = 0; i < values.length; i++) {
    var cellData = values[i][0].toString().toLowerCase();
    if (cellData === dataToCheck) {
      return true;
    }
  }
  return false;
}

function doPost(e) {
  var lock = LockService.getScriptLock()
  lock.tryLock(10000)
  
  var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'));
  var sheet = doc.getSheetByName(sheetName);

  // var postData = JSON.parse(e.postData.contents);
  // var usernameToCheck = postData['username'];
  // var usernameToCheck = e.parameter.username;
  var usernameToCheck = e.parameter['username']

  if (usernameExists(usernameToCheck)) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': 'Username already exists' }))
      .setMimeType(ContentService.MimeType.JSON);
  }

  try {
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var nextRow = sheet.getLastRow() + 1;

    var newRow = headers.map(function (header) {
      return header === 'timestamp' ? new Date() : e.parameter[header];
    });

    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);

    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
      .setMimeType(ContentService.MimeType.JSON);
  }
  
  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON);
  }

  finally {
    lock.releaseLock()
  }
}

目标是检查传入数据是否存在于工作表 A 列(即“用户名”字段)中,如果存在则跳过保存过程。我什至尝试使用 postData 但仍然保存数据(如果存在)。我还创建了一个可以工作的测试函数,但它在使用 javascript 的实际数据中不起作用,它不起作用。这是我的测试功能

function checker() {
  if (usernameExists('userTest')) {
    Logger.log("Username already exists.");
  } else {
    Logger.log("Username doesn't exist.");
  }
}

我还尝试使用

usernameToCheck.toString()

将参数转换为字符串

这是我在 javascript 文件中的代码

var form = document.getElementById('myForm');
function submitForm() {
    fetch(scriptURL, { method: 'POST', body: new FormData(form)})
        .then(response => showSuccessMessage(response))
        .catch(error => showErrorMessage(error))
}

这是我调试的第二天。或者说这可行吗?

javascript google-apps-script google-sheets web-applications
1个回答
0
投票

问题解决了!这就是我所做的。 在帖子请求中添加参数解决了问题,我添加了

fetch(scriptURL+'?username=' + usernameToCheck.value, { method: 'POST', body: formData})

我之前唯一的问题是从这里获取用户名的值
var usernameToCheck = e.parameter['username']

添加参数后我更改了行
var usernameToCheck = e.parameter['username']


var usernameToCheck = e.parameter.username


非常感谢您花时间分享您的想法;它激励我想出一个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.