Измените автоматически все тексты на всех листах на UPPERCASE в электронной таблице Google, но исключите некоторые символы Юникода - PullRequest
1 голос
/ 11 октября 2019

После вопроса будь мной здесь У меня есть этот скрипт, предоставленный @utphx (большое спасибо @utphx) ...

function onEdit(e) {
if (Object.prototype.toString.call(e.range.getValue()) !== "[object Date]" ) {
e.range.setValue(e.value.toUpperCase());
}
}

Это прекрасно работает, но яЯ хочу немного его расширить, чтобы исключить некоторые символы Юникода, например ... например ... Ⓚ ☎, потому что они имеют больший размер шрифта, чем буквы и цифры в той же ячейке, и после функции верхнего регистра они меняются одним и тем же шрифтомразмер, как буквы и цифры, которые они выглядят очень маленькими по сравнению с ними. Я пробовал несколько способов, которые я нашел здесь и в остальной части сети, но из-за моего недостатка знаний в кодировании Java, и, поскольку эти символы могут находиться в одной ячейке с цифрами и буквами, либо все символы заменяются на заглавныеили ни один из них.

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

РЕДАКТИРОВАТЬ: я нашел следующий код в этот ответ @Ruben и с добавлением предложения @ ocordova об использовании метода getFormula () , функция в верхнем регистре работает правильно, не касаясь ячеек, содержащих любые формулы и символы этого типа. : ☎ 101

function onEdit(e) {
  var range = e.range;
  var value = range.getValue();
  var sheet = range.getSheet();
  if (range.getRow() > 1 && 
      range.getColumn() > 1 && 
      typeof value === 'string') {
    if(!range.getFormula()) {
      range.setValue(value.toUpperCase());
    } else {
    if (ind === 0 && e.range.rowStart > 1 && e.range.columnStart >= 1  && e.range.getFormula() == '') {
      e.range.setValue(e.value.toUpperCase());
      return;
      } 
    }
  }
}

Единственное, что мне нужно добавить сейчас, это проверить, содержат ли ячейки какой-либо из этих символов: Ⓚ Ⓘ Ⓣ Ⓕ (и, возможно, еще несколько букв или цифр этого типа)так что исключить их из заглавной функции. Кто-нибудь знает, как я могу это сделать? Я думаю, что REGEX будет решением, но я понятия не имею, как и где поместить его в приведенный выше код.

EDIT2: поцарапать вышеупомянутый EDITЭтот код ведет себя очень странно. Если вы выберете несколько ячеек, чтобы изменить стиль границы, то он скопирует значения из ячейки во все остальные выделенные ячейки !!!. Я выложу новый вопрос по этому поводу.

Заранее спасибо

Nessus

1 Ответ

2 голосов
/ 12 октября 2019

Попробуйте это (я установил размер шрифта на 15, но вы можете изменить его по своему усмотрению)

function font_size(cell){
  var font_size = 15
  var range = SpreadsheetApp.getActiveSheet().getRange(cell);
  var value = range.getValue().toString();
  var letterNumber = /^[\x00-\x7F]*$/;
  var rich = SpreadsheetApp.newRichTextValue();
  rich.setText(value); 
  for (var i=0;i<value.length;i++){ 
    if (letterNumber.test(value.charAt(i)) == false){
       var style = SpreadsheetApp.newTextStyle(); 
    style.setFontSize(font_size); 
    var buildStyle = style.build(); 
    rich.setTextStyle(i,i+1,buildStyle); 
    }   
  }
  var format = rich.build()
  range.setRichTextValue(format); 
}


function onEdit(e) {
if (Object.prototype.toString.call(e.range.getValue()) !== "[object Date]" ) {
 e.range.setValue(e.value.toUpperCase());
 var cell = e.source.getActiveRange().getA1Notation();
 font_size(cell)
}
}

По сути, это поиск не-ascii символов и изменение их размера шрифта.

Ссылка: https://developers.google.com/apps-script/reference/spreadsheet/rich-text-value-builder

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