Как получить форматированный массив в Google AppScript? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть код, который берет каждую ячейку из gsheet и меняет формат с помощью appscript, но это не исправляет его обратно на листе google. Я использовал это, потому что, хотя формат был правильным в таблице gsheet, при использовании getvalue() число теряет свой формат.

  var Qty1 = ss.getRange(i, 15).getValue();

  var Qty1Format = Qty1.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');   
//Output has a thousands separator and two decimal places.

Это требует много времени для выполнения, и в результате я ищу альтернативные способы исправить формат.

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

Я пытался это кодировать, но был бы признателен за любую помощь в том, как изменить формат массива или альтернативные способы достижения результата.

Пример попытки кода:

function copypastetest() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  var rng = ss.getRange("C2:"+"c"+lr).getValues();
  var frng = rng.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
  var copy = ss.getRange("C2:"+"c"+lr).setValues(frng)
}

Дальнейшее редактирование:
@ Ответ Купера точен. Однако, возможно, я не задал правильный вопрос для решения моей проблемы. В конечном итоге я хочу взять значения из таблицы Google и заменить заполнители в Google do c.

См. Ниже (хотя число отформатировано, оно все еще кажется неформатированным в строке формул - и я должен заметил это раньше, но я не заметил)
google sheet sample

Итак, как я могу отформатировать массив (или получить массив, который отформатирован в первую очередь, чтобы прийти на мой Logger.log в appscript?

Вот остальная часть скрипта, чтобы вы поняли, чего я хочу достичь,

function generatetest() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  var rng = ss.getRange("A1:"+"F"+lr).getValues();

  for (var i =2;i<=lr;i++){

    if(ss.getRange(i, 1).getValue()){
      var client = rng[i-1][1];
      var email = rng[i-1][2];

  var documentId = DriveApp.getFileById('1j36HPQkTPc0R4GCtA0XKcmeHUVPsgBKoyNIl93HFhp0').makeCopy().getId();

      DriveApp.getFileById(documentId).setName(client);  

  var body = DocumentApp.openById(documentId).getBody();
      body.replaceText('{Name}', client).replaceText('{Email}', email)
          }
    else {}
  }
}

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Если я правильно понял вашу проблему, я считаю, что ее можно решить с помощью метода getDisplayValues() класса Range. Этот метод копирует формат ячейки и возвращает отформатированную строку.

var rng = ss.getRange("C2:"+"c"+lr).getDisplayValues()


Ссылки:

1 голос
/ 05 мая 2020

Я пробовал это, и похоже, что это сработает, если я понимаю вашу проблему.

function runOne() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Sheet22');
  const rg=sh.getRange(1,1,sh.getLastRow());
  const vA=rg.getValues();
  vA.forEach(function(r,i){
    sh.getRange(i+1,2).setValue(r[0]).setNumberFormat('#,##0.00');
  })
}

Вот мои начальные данные:

1000000.33
2000000.34
3000000.35
4000000.36
5000000.37
6000000.38
7000000.39
8000000.4
9000000.41
10000000.42
11000000.43
12000000.44
13000000.45
14000000.46
15000000.47
16000000.48
17000000.49
18000000.5

И вот мои конечные данные:

1000000.33,1000000.33
2000000.34,2000000.34
3000000.35,3000000.35
4000000.36,4000000.36
5000000.37,5000000.37
6000000.38,6000000.38
7000000.39,7000000.39
8000000.4,8000000.4
9000000.41,9000000.41
10000000.42,10000000.42
11000000.43,11000000.43
12000000.44,12000000.44
13000000.45,13000000.45
14000000.46,14000000.46
15000000.47,15000000.47
16000000.48,16000000.48
17000000.49,17000000.49
18000000.5,18000000.5

Вот как выглядит лист:

enter image description here

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

function getandSetActiveRangeFormats() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getActiveRange();
  var fA=rg.getNumberFormats();
  var html='<style>th,td{border:1px solid black;}</style><table><tr><th>Item</th><th>A1 Notation</th><th>Number Format</th><th>Enter Format</th><th>Set Format</th></tr>';
  var item=1;
  var row=rg.getRow();
  var col=rg.getColumn();
  fA.forEach(function(r,i){
    r.forEach(function(c,j){
      var txt=Utilities.formatString('<input type="text" id="RC-%s-%s" />',row+i,col+j);
      var btn=Utilities.formatString('<input type="button" value="Set Form" onClick="setFormat(%s,%s);" />',row+i,col+j);
      html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',item++,sh.getRange(row + i,col + j).getA1Notation(),fA[i][j],txt,btn);
    });
  });
  html+='</table><input type="button" value="Exit" onClick="google.script.host.close();" />';
  html+='<script>function setFormat(row,col){var f=document.getElementById("RC-"+row+"-"+col).value;google.script.run.setFormat(row,col,f);}</script>';
  var ui=HtmlService.createHtmlOutput(Utilities.formatString(html));
  SpreadsheetApp.getUi().showModelessDialog(ui, "Display and Set Active Range Formats")
}

function setFormat(row,col,format) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  sh.getRange(row,col).setNumberFormat(format);
}
...