【问题标题】:How to Conditionally Change Data in Google Apps Script for Sheet如何有条件地更改工作表的 Google Apps 脚本中的数据
【发布时间】:2021-11-02 19:32:10
【问题描述】:

我要解决的问题涉及一个谷歌表,其中包含两个单独的子表,分别称为“设备”和“表单响应”。我正在尝试自动化 Google 表单响应以更新工作表。表单响应表提供三个相关列:用户名、旧资产 ID 和新资产 ID。在设备表中有两个相关列:用户名和资产 ID。我希望脚本通过设备表中的资产 ID 列进行解析,以从旧资产 ID 列表中查找匹配项。如果匹配,则应将该字段替换为“”,然后在“设备”列表中找到新的资产 ID,并将表单响应中提供的用户名分配给该行。

表单响应:

user_name old asset ID new asset ID
joe 1234 9876

设备:

user_name asset ID
joe 1234
null 9876

脚本后的设备:

user_name asset ID
null 1234
joe 9876

如果字段为空,我目前尝试的方式会产生错误,所以我真的在寻找正确方向的推动。我有编程经验,但应用程序脚本与我使用的其他语言不同,我很难找到有关它的文档。我无法实现我通常使用的逻辑。

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

您可能可以从以下内容开始:

function onFormSubmit(e) {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Device');
  const sr = 2;//data start row
  const hr = 1;//header row
  const hA = sh.getRange(hr, 1, 1, sh.getLastColumn()).getValues()[0];
  let idx = {};
  hA.forEach((h, i) => { idx[h] = i; });
  let found = false;
  const vs = sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).getValues();
  for (let i = 0; i < vs.length; i++) {
    let r = vs[i];
    if (r[idx['asset ID']] == e.namedValues['old asset ID'][0]) {
      sh.getRange(i + sr, idx['user_name'] + 1).setValue('');
      found == true;
      break;
    }
  }
  if (found) {
    for (let i = 0; i < vs.length; i++) {
      let r = vs[i];
      if (r[idx['asset ID']] == e.namedValues['new asset ID']) {
        sh.getRange(i + sr, idx['user_name'] + 1).setValue(e.namedValues['user_name'][0]);
        break;
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    试试这个:

    这里我用Range.createTextFinder(string)Asset ID列中搜索了old assets IDnew assets ID设备。它将返回一个TextFinder Class,它具有findNext() 方法,该方法将返回第一个匹配单元格的范围,并使用该范围来确定要编辑的单元格。

    function onFormSubmit(e) {
      var responses = e.namedValues;
      var username = responses['user_name'][0];
      var oldId = responses['old asset ID'][0];
      var newId = responses['new asset ID'][0];
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var deviceSheet = ss.getSheetByName("Devices");
    
      var oldIDFinder = deviceSheet.getRange(2, 2, deviceSheet.getLastRow()-1, 1).createTextFinder(oldId).findNext();
      if(oldIDFinder){
        var newIDFinder = deviceSheet.getRange(2, 2, deviceSheet.getLastRow()-1, 1).createTextFinder(newId).findNext();
        if(newIDFinder){
          deviceSheet.getRange("A"+oldIDFinder.getRow()).clear();
          deviceSheet.getRange("A"+newIDFinder.getRow()).setValue(username);
        }  
      }
    }
    

    注意:如果在该范围内找不到旧资产 ID 或新资产 ID,这将不起作用。

    示例:

    未找到旧 ID:

    未找到新 ID:

    找到旧 ID 和新 ID:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多