Я пытаюсь заменить все вхождения определенного текста другим текстом с помощью скрипта Google. Я хочу использовать сценарий, чтобы мне не приходилось вводить вручную каждый раз, когда я хочу заменить.

Это то, что я пробовал. Скрипт не выдает ошибок, поэтому я не уверен, почему он не работает. Я хочу, чтобы сценарий заменил текст example внутри ссылок, которые выглядят так example.com/this-is-a-link на example2.com/this-is-a-link. Я заменяю текст на нескольких листах.

Вот что я пробовал.

function rePlace() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("a1:a10000");
  var data  = range.getValues();

  for (var row = 0; row < data.length; row++) {
    for (var col = 0; col < data[row].length; col++) {
      data[row][col] = (data[row][col]).toString().replace('/.*example.*/', 'example2');
    }
  }
  range.setValues(data);
}

Спасибо.

0
mary ongubo 21 Окт 2020 в 09:22

1 ответ

Лучший ответ

В вашем сценарии replace('/.*example.*/', 'example2') необходимо изменить следующим образом.

Из

data[row][col] = (data[row][col]).toString().replace('/.*example.*/', 'example2');

Кому:

data[row][col] = (data[row][col]).toString().replace('example', 'example2');

Или

data[row][col] = (data[row][col]).toString().replace(/example.com\//, 'example2.com/');

Таким образом, example.com/this-is-a-link изменяется на example2.com/this-is-a-link.

В вашей ситуации, в качестве другого метода, как насчет использования TextFinder? Когда ваш скрипт изменяется, он становится следующим. При использовании TextFinder, я думаю, стоимость процесса будет ниже, чем у текущего скрипта.

Измененный скрипт:

function rePlace() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("a1:a10000");
  range.createTextFinder("example").replaceAllWith("example2");  // Added
}

Или

function rePlace() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("a1:a10000");
  range.createTextFinder("example.com/").useRegularExpression(true).replaceAllWith("example2.com/");  // Added
}

Ссылки:

Добавлено 1:

Если вы хотите использовать приведенный выше сценарий для нескольких листов в активной электронной таблице Google, как насчет следующего сценария?

Пример сценария:

В этом скрипте используется диапазон a1:a10000 на всех листах.

SpreadsheetApp
  .getActiveSpreadsheet()
  .getSheets()
  .forEach(sheet => sheet
    .getRange("a1:a10000")
    .createTextFinder("example.com/")
    .useRegularExpression(true)
    .replaceAllWith("example2.com/")
  );

Если вы хотите использовать определенные листы, вы также можете использовать следующий сценарий.

var sheetNames = ["Sheet1","Sheet3",,,];  // Please set the sheet names.
SpreadsheetApp
  .getActiveSpreadsheet()
  .getSheets()
  .forEach(sheet => {
    if (sheetNames.includes(sheet.getSheetName())) {
      sheet
        .getRange("a1:a10000")
        .createTextFinder("example.com/")
        .useRegularExpression(true)
        .replaceAllWith("example2.com/")
    }
  });

Добавлено 2:

По поводу вашего второго вопроса о Is there a way to replace all at once without the script visiting one sheet after another to make replacements? Because I think that's why it's delaying. I have 50 sheets. Perfect solution but if it would mass replace I think it would be even better? из вашего комментария, в этом случае я хотел бы предложить использовать API Таблиц. Я думаю, что при использовании Sheets API можно будет снизить стоимость процесса.

Пример сценария:

Прежде чем использовать этот сценарий, включите API-интерфейс Sheets в расширенных службах Google .

const ss = SpreadsheetApp.getActiveSpreadsheet();
const requests = ss.getSheets().map(s => ({
  findReplace:{
    find: "example.com/",
    searchByRegex: true,
    replacement: "example2.com/",
    range: {sheetId: s.getSheetId(), startRowIndex: 0, startColumnIndex: 0, endColumnIndex: 1}
  }
}));
Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());

Заметка:

  • Если вы проверите все ячейки на всех листах в электронной таблице Google, я думаю, что вы также можете использовать следующий скрипт.

      SpreadsheetApp.getActiveSpreadsheet().createTextFinder("example.com/").useRegularExpression(true).replaceAllWith("example2.com/");
    
2
Tanaike 21 Окт 2020 в 08:06