自动替换Google表格中的文本值

龙乔

我已经建立了一封发送给Google表格自动化的电子邮件,其中特定电子邮件中的内容自动变为Google表格中的新行。但是值之一是完整地址(始终是两个地址之一),我希望将其自动更改为仅地名。因此,“地址1”到“地名1”,“地址2”到“地名2”。文本始终在E列中,并添加到新行中。

这是我尝试使用的方法:

function onOpen() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("e1:e10");
var to_replace = "full long address";
var replace_with = "place name";
replaceInSheet(sheet,range, to_replace, replace_with);
}

function replaceInSheet(sheet, range, to_replace, replace_with) {
//Confirm
var ui = SpreadsheetApp.getUi(); 
var spread = SpreadsheetApp.getActiveSpreadsheet();

var result = ui.alert(
 "Will update " + to_replace + " to " + replace_with + " ",
 'Are you sure you want to continue?',
  ui.ButtonSet.YES_NO);

// Process the user's response.
if (result == ui.Button.YES) {

// User clicked "Yes".
spread.toast("Will update " + to_replace + " to " + replace_with + " ", "ALERT");

var data  = range.getValues();

var oldValue="";
var newValue="";
var cellsChanged = 0;

for (var row=0; row<data.length; row++) {
  for (var item=0; item<data[row].length; item++) {
    oldValue = data[row][item];
    newValue = data[row][item].replace(to_replace, replace_with);
    if (oldValue!=newValue)
    {
      cellsChanged++;
      data[row][item] = newValue;
    }
  }
}
range.setValues(data);
spread.toast(cellsChanged + " cells changed", "STATUS");
}
else {
// User clicked "No" or X in the title bar.
spread.toast("No action taken", "ABANDONED");
}
}
泰迪诺斯

OP的原始代码最优雅(源自webapps),但是对于该任务而言过于复杂,并且也不适用于替换两个地址。

以下代码本质上是OP原始版本的简化版本。Logger.log()保留了许多语句,这些语句将使OP(如果需要和/或必要时)可以在代码的不同阶段测试值。

代码逻辑很简单。
1)将要查找和替换的地址描述为变量(var address01findvar address01replace,对地址02冲洗并重复)。OP可以根据自己的喜好对其进行编辑。

2)取得E栏的最后一行。

3)获取列E的值。

4)逐行迭代这些值,以测试等于address01find的值address02find如果找到该值address01replace,则address02replace分别替换该值

5)循环后,setValues用于整个数据范围。大多数字段值不会更改,但是在循环中修改的那些字段将更新为修改后的值。

function onOpen() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var MenuEntries = [{
        name: "Replace addresses",
        functionName: "replaceaddresss"
    }];
    ss.addMenu("Address Update", MenuEntries);
};

function replaceaddresss() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    //Logger.log("DEBUG: sheet name: "+sheet.getSheetName());//DEBUG
    //Logger.log("DEBUG: range: "+range.getA1Notation());//DEBUG
    var Evals = ss.getRange("E1:E").getValues();
    var Elast = Evals.filter(String).length;
    //Logger.log("DEBUG: last row in E: "+Elast);//DEBUG
    var range = sheet.getRange(1, 5, Elast)
    //Logger.log("DEBUG: range: "+range.getA1Notation());//DEBUG
    var columnValues = range.getValues();
    var address01find = "Full Address 123, Tokyo, Japan";
    var address01replace = "Place Name No.1";
    var address02find = "Short Address 123, Tokyo, Japan";
    var address02replace = "Place Name No.2";
    //Logger.log("DEBUG: address #1: find: "+address01find+", replace with: "+address01replace);//DEBUG
    //Logger.log("DEBUG: address #2: find: "+address02find+", replace with: "+address02replace);//DEBUG
    for (i = 0; i < Elast; i++) {
        if (columnValues[i][0] === address01find) {
            columnValues[i][0] = address01replace;
        }
        if (columnValues[i][0] === address02find) {
            columnValues[i][0] = address02replace;
        }
    };
    range.setValues(columnValues);
}

之前和之后

之前和之后


更新为OnEdit

此更新着眼于脚本创建数据(即E列中的街道地址)的场景。除了从onEdit知道事件范围外,代码基本相同,并且仅在地址值更改时才需要获取值,评估地址并更新数据。

注意:此脚本要求将其创建为可安装的OnEdit触发器。

function oneditemailupdate(e) {

    // set up spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();

    // setup triggerdetector
    var trigger = 0;

    // User variables
    // identify the column to watch
    var addresscol = 5; // = Column E - this is the column to watch

    // Setup the old and new addresses
    var address01find = "Full Address 123, Tokyo, Japan";
    var address01replace = "Place Name No.1";
    var address02find = "Short Address 123, Tokyo, Japan";
    var address02replace = "Place Name No.2";

    // list onedit values for debug reporting and other use
    var debug_e = {
        authMode: e.authMode,
        range: e.range.getA1Notation(),
        source: e.source.getId(),
        user: e.user,
        value: e.value,
        oldValue: e.oldValue
    };
    //Logger.log("DEBUG: AuthMode: "+debug_e.authMode);// DEBUG
    //Logger.log("DEBUG: Range: "+debug_e.range);// DEBUG
    //Logger.log("DEBUG: Source: "+debug_e.source);// DEBUG
    //Logger.log("DEBUG: User: "+debug_e.user);// DEBUG
    //Logger.log("DEBUG: user email"+debug_e.user.getEmail());// DEBUG
    //Logger.log("DEBUG: Value: "+debug_e.value);// DEBUG
    //Logger.log("DEBUG: Old value: "+debug_e.oldValue);// DEBUG
    //Logger.log("DEBUG: AuthMode: "+debug_e.authMode+", Range: "+debug_e.range+", source: "+debug_e.source+", user: "+debug_e.user+", value: "+debug_e.value+", old value: "+debug_e.oldValue);//DEBUG

    // get the values for the range that was edited (e.range)
    var emailvalues = e.range.getValues();

    // evaluate email address value#1 and change value if necessary
    if (emailvalues[0][4] === address01find) {
        emailvalues[0][4] = address01replace;
        // set the trigger so that the range value can be updated
        trigger = 1;
        //Logger.log("DEBUG: Updated address01");//DEBUG
    }

    // evaluate email address value#2 and change value if necessary
    if (emailvalues[0][4] === address02find) {
        emailvalues[0][4] = address02replace;
        // set the trigger so that the range value can be updated
        trigger = 1;
        //Logger.log("DEBUG: Updated address02");//DEBUG
    }

    // if trigger value has been set to one, then update the values
    // Logger.log("DEBUG: Trigger value is "+trigger);//DEBUG
    if (trigger == 1) {
        e.range.setValues(emailvalues);
    }

}

更新-表格提交

Mea culpa。我设法忽略了一个事实,那就是OP表示电子表格是一封电子邮件回复表。脚本执行和API请求不会导致触发器运行因此onEdit(无论是简单触发器还是可安装触发器)都将无法工作。

  • 该脚本需要作为可安装脚本安装
  • 事件类型=“在表单上提交”

调用事件对象时,它将返回“表单提交”事件数据

注意:工作表名称现在是一个变量。否则,该代码与先前的onEdit版本几乎(但不太完全)相同。

function addressupdate(e) {

    // set up spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var formresponsesheet = "Form Responses 2";
    var sheet = ss.getSheetByName(formresponsesheet);

    // setup changetriggerdetector
    var trigger = 0;

    // User variables
    // identify the column to watch
    var addresscol = 5; // = Column E - this is the column to watch

    // Setup the old and new addresses
    var address01find = "Full Address 123, Tokyo, Japan";
    var address01replace = "Place Name No.1";
    var address02find = "Short Address 123, Tokyo, Japan";
    var address02replace = "Place Name No.2";

    // list onedit values for debug reporting and other use
    var debug_e = {
        authMode: e.authMode,
        range: e.range.getA1Notation(),
        namedValues: e.namedValues,
        triggerUid: e.triggerUid,
        values: e.values
    };
    //Logger.log("DEBUG: AuthMode: "+debug_e.authMode);// DEBUG
    //Logger.log("DEBUG: Range: "+debug_e.range);// DEBUG
    //Logger.log("DEBUG: named ValuesSource: "+debug_e.namedValues);// DEBUG
    //Logger.log("DEBUG: triggerUid: "+debug_e.triggerUid);// DEBUG
    //Logger.log("DEBUG: values: "+debug_e.values);// DEBUG

    // get the values for the range that was created (e.range)
    var emailvalues = e.range.getValues();

    // evaluate email address value#1 and change value if necessary
    if (emailvalues[0][4] === address01find) {
        emailvalues[0][4] = address01replace;
        // set the trigger so that the range value can be updated
        trigger = 1;
        //Logger.log("DEBUG: Updated address01");//DEBUG
    }

    // evaluate email address value#2 and change value if necessary
    if (emailvalues[0][4] === address02find) {
        emailvalues[0][4] = address02replace;
        // set the trigger so that the range value can be updated
        trigger = 1;
        //Logger.log("DEBUG: Updated address02");//DEBUG
    }

    // if trigger value has been set to one, then update the values
    // Logger.log("DEBUG: Trigger value is "+trigger);//DEBUG
    if (trigger == 1) {
        e.range.setValues(emailvalues);
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一直试图在Google表格中自动执行“查找和替换”,但是没有用

在Google表格中查找和替换

通过Google表格中的查询对多个文本值进行分组

Google表格/应用脚本可在输入值时自动将日期戳添加到表格中

替换Google表格中的函数中的文本(使用脚本)

在Google脚本中创建与Google表格中的值列表配合使用的自动完成功能

使用Google App脚本替换Google表格中的文本而无需重新格式化值

在单元格中查找文本并将其替换为Google脚本和Google表格

如何禁用NSTextViews中的自动文本替换?

从文本替换中设置值

文本框的值是自动追加的,并使用jquery在下拉列表中替换

替换表格中的值

自动填充Google表格中的条件格式

替换表格中的值

逐列自动替换 Excel 中的文本

值包含条件格式规则 Google 表格中的许多文本

Google 表格 REGEXREPLACE() 用自身替换文本

如何让 Google 表格根据其中一列中的值自动对行进行排序?

根据另一个表格excel中的值替换列的文本

如何创建自动从 Google 表格中获取数据并替换幻灯片模板中的标签的函数?

如何从 Web 应用程序中的文本字段向 Google 表格添加新值,然后自动更新关联的下拉列表?

Google 表格查询:通过附加值列表替换单元格中的值

使用 Google Apps 脚本,如何替换 Google 表格模板中的文本以制作新表格?

我可以使用 Google Apps Script 替换 Google 表格中多个标签中的文本吗?

RegEx 替换不更新范围 Google 表格中的值

Google 表格中的自动排班

如何根据值自动将 Google 表格中的列值转换为超链接?

使用 TextFinder 和 Apps 脚本在 Google 表格中查找和替换文本

Google 表格 - 在一周中的特定日期和时间自动记录表格 1 到表格 2 的值