【问题标题】: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 |
如果字段为空,我目前尝试的方式会产生错误,所以我真的在寻找正确方向的推动。我有编程经验,但应用程序脚本与我使用的其他语言不同,我很难找到有关它的文档。我无法实现我通常使用的逻辑。
【问题讨论】:
-
如果您希望有关应用程序脚本文档的文档,请尝试here
-
标签:
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 ID和new 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: