Google Sheets Найти и заменить скрипт - PullRequest
0 голосов
/ 04 июля 2019

Так что я возился с этими двумя версиями скрипта Find and Replace. Проблема, с которой я сталкиваюсь, заключается в том, что любое последовательное использование сценария удаляет предыдущие использования. Как видно здесь . Меня сослали на эти решения , но я либо реализовал их неправильно, либо они не нуждались в исправлении.

Я бы хотел продолжать использовать сценарий вместо одноразового поиска и замены, если это возможно?

Определенно не самый лучший во всем этом, извините, если я здесь что-то не так! Спасибо:)

function runReplaceInSheet(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Underlevel");
  //  get the current data range values as an array
  //  Fewer calls to access the sheet -> lower overhead 
  var values = sheet.getDataRange().getValues();  

  // Replace Staff Names
  replaceInSheet(values, /^T$/, '=image("https://i.imgur.com/Dxl893F.png")');
  replaceInSheet(values, /^A$/, '=image("https://i.imgur.com/omc7F9l.png")');
  replaceInSheet(values, /^R$/, '=image("https://i.imgur.com/12ZmSp3.png")');
  replaceInSheet(values, /^M$/, '=image("https://i.imgur.com/kh7RqBD.png")');
  replaceInSheet(values, /^H$/, '=image("https://i.imgur.com/u0O7fsS.png")');
  replaceInSheet(values, /^F$/, '=image("https://i.imgur.com/Hbs3TuP.png")');
  replaceInSheet(values, /^t$/, '=image("https://i.imgur.com/Dxl893F.png")');
  replaceInSheet(values, /^a$/, '=image("https://i.imgur.com/omc7F9l.png")');
  replaceInSheet(values, /^r$/, '=image("https://i.imgur.com/12ZmSp3.png")');
  replaceInSheet(values, /^m$/, '=image("https://i.imgur.com/kh7RqBD.png")');
  replaceInSheet(values, /^h$/, '=image("https://i.imgur.com/u0O7fsS.png")');
  replaceInSheet(values, /^f$/, '=image("https://i.imgur.com/Hbs3TuP.png")');

  // Write all updated values to the sheet, at once
  sheet.getDataRange().setValues(values);
}

function replaceInSheet(values, to_replace, replace_with) {
  //loop over the rows in the array
  for(var row in values){
    //use Array.map to execute a replace call on each of the cells in the row.
    var replaced_values = values[row].map(function(original_value) {
      return original_value.toString().replace(to_replace,replace_with);
    });

    //replace the original row values with the replaced values
    values[row] = replaced_values;
  }
}

function runReplaceInSheet(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Underlevel");
  //  get the current data range values as an array
  //  Fewer calls to access the sheet -> lower overhead 
  var values = sheet.getDataRange().getValues();  

var range = sheet.getDataRange();
var replaceObj = {
  //to_replace: imgur id
  T: 'Dxl893F',
  A: 'omc7F9l',
  R: '12ZmSp3',
  M: 'kh7RqBD',
  H: 'u0O7fsS',
  F: 'Hbs3TuP',
};
var regex = new RegExp('^(' + Object.keys(replaceObj).join('|') + ')$', 'g');// /^(T|A)$/
function replacer(match) {
  return '=image("https://i.imgur.com/' + replaceObj[match] + '.png")';
}
range.setValues(
  range.getValues().map(function(row) {
    return row.map(function(original_value) {
      return original_value.toString().replace(regex, replacer);
    });
  })
);

var data = range.getValues();
  data = range.getFormulas().map(function(e, i) {//i=index of row(e)
    return e.map(function(f, j) {//j = index of column(f)
      return f === "" ? data[i][j] : f;
    });
  });
}

1 Ответ

0 голосов
/ 04 июля 2019
  • Вы хотите, чтобы новое значение заменялось сохранением существующих значений (изображений) при запуске скрипта.

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

Точки модификации:

  • В этой модификации сначала извлекаются как значения, так и формулы.И когда для клеток, которые имеют формулы, ставятся те же формулы.Когда для ячеек, имеющих значения, запускается сценарий замены и помещаются замененные формулы.
  • В указанном выше порядке в этой модификации используется setFormulas() вместо setValues().

Модифицированный скрипт:

От:
range.setValues(
  range.getValues().map(function(row) {
    return row.map(function(original_value) {
      return original_value.toString().replace(regex, replacer);
    });
  })
);

var data = range.getValues();
data = range.getFormulas().map(function(e, i) {//i=index of row(e)
  return e.map(function(f, j) {//j = index of column(f)
    return f === "" ? data[i][j] : f;
  });
});
До:
// This part is not used in this modification.
// range.setValues(
//   range.getValues().map(function(row) {
//     return row.map(function(original_value) {
//       return original_value.toString().replace(regex, replacer);
//     });
//   })
// );

var data = range.getValues();
range.setFormulas(
  range.getFormulas().map(function(e, i) {//i=index of row(e)
    return e.map(function(f, j) {//j = index of column(f)
      return f === "" ? data[i][j].toString().replace(regex, replacer) : f;
    });
  })
);

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...