Очистка форматов в Google Sheets

У меня есть Microsoft Flow, отправляющий данные в Google Sheet. Когда данные появляются на листе, в некоторых ячейках есть скрытый апостроф, который препятствует вычислениям и некоторым формулам.

У меня есть скрипт, который форматирует ячейки с числом, чтобы я мог выполнять вычисления. Чего я не могу сделать, так это очистить апостроф из ячейки, которую я хочу запустить = СЕЙЧАС (), чтобы я мог создать метку времени.

Я создал скрипт, но не могу понять, как заставить эту ячейку делать то, что я хочу.

function setFormat(){SpreadsheetApp.getActiveSheet().getRange("A2:A").getValue().replace("'=NOW()","=NOW()");SpreadsheetApp.getActiveSheet().getRange("C2:C").setNumberFormat('000');SpreadsheetApp.getActiveSheet().getRange("D2:D").setNumberFormat('000');SpreadsheetApp.getActiveSheet().getRange("E2:E").setNumberFormat('000');SpreadsheetApp.getActiveSheet().getRange("F2:F").setNumberFormat('000');}`

форматировать в ячейке


person gillers322    schedule 16.05.2017    source источник


Ответы (1)


Как насчет этого образца?

  1. С помощью getValues() извлекаются данные "A2:A". https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues

  2. Данные, полученные в 1, преобразуются из '=NOW() в =NOW().

  3. С помощью setFormulas() преобразованные данные импортируются в формат "A2:A". https://developers.google.com/apps-script/reference/spreadsheet/range#setformulasformulas

  4. setNumberFormat() отлично подходит для вашего скрипта.

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

function setFormat(){
  var ss = SpreadsheetApp.getActiveSheet();
  var Data = ss.getRange("A2:A").getValues();
  var replacedData = [[i[0].replace("'=NOW()","=NOW()")] for each (i in Data) if(i[0])];
  ss.getRange(2, 1, replacedData.length, replacedData[0].length).setFormulas(replacedData);

  ss.getRange("C2:C").setNumberFormat('000');
  ss.getRange("D2:D").setNumberFormat('000');
  ss.getRange("E2:E").setNumberFormat('000');
  ss.getRange("F2:F").setNumberFormat('000');
}

Если я неправильно понял ваш вопрос, извините.

Добавлено 1 :

Тип =NOW() как формулы - объект. Таким образом, только '=NOW() в виде строки преобразуется в формулу =NOW() путем сравнения типа. Когда вы добавляете больше данных, добавленные данные будут преобразованы.

function setFormat(){
  var ss = SpreadsheetApp.getActiveSheet();
  var Data = ss.getRange("A2:A").getValues();
  var replacedData = [typeof(i[0])=="object" ? ["=NOW()"] : [i[0].replace("'=NOW()","=NOW()")] for each (i in Data) if(i[0])];
  ss.getRange(2, 1, replacedData.length, replacedData[0].length).setFormulas(replacedData);

  ss.getRange("C2:C").setNumberFormat('000');
  ss.getRange("D2:D").setNumberFormat('000');
  ss.getRange("E2:E").setNumberFormat('000');
  ss.getRange("F2:F").setNumberFormat('000');
}

Добавлено 2 :

Этот пример импортирует объект даты в виде строки, когда были импортированы новые данные.

function setFormat(){
  var ss = SpreadsheetApp.getActiveSheet();
  var Data = ss.getRange("A2:A").getValues();
  var replacedData = [
      typeof(i[0])=="object"
      ? [i[0]]
      : [i[0].replace("=NOW()", Utilities.formatDate(
        new Date(),
        Session.getScriptTimeZone(),
        'yyyy/M/d HH:mm:ss')
      )
    ]
    for each (i in Data) if(i[0])
  ];
  ss.getRange(2, 1, replacedData.length, replacedData[0].length).setValues(replacedData);

  ss.getRange("C2:C").setNumberFormat('000');
  ss.getRange("D2:D").setNumberFormat('000');
  ss.getRange("E2:E").setNumberFormat('000');
  ss.getRange("F2:F").setNumberFormat('000');
}
person Tanaike    schedule 16.05.2017
comment
Спасибо. Я получаю сообщение об ошибке TypeError: Cannot read property length from undefined. (строка 5, код файла) - person gillers322; 16.05.2017
comment
На самом деле, я столкнулся с проблемой. Новые строки данных импортируются из потока Microsoft каждый час. Сценарий сталкивается с проблемой, поскольку он останавливается после первой строки, поскольку теперь он находит правильную дату, а не =NOW(), поэтому все остальные строки не обновляются. Любые идеи? Спасибо - person gillers322; 16.05.2017
comment
Могу я спросить вас о данных? Когда я смогу узнать данные, я смогу попытаться найти решение. - person Tanaike; 16.05.2017
comment
Я импортирую данные учетной записи пользователя Twitter - я получаю их имя, твиты, подписчиков и т. д. Что я пытаюсь сделать, так это получить временную метку в столбце A всякий раз, когда импортируются новые данные. Я могу импортировать что-либо в столбец A - я просто подумал, что =NOW() будет работать, но он продолжает импортировать его с апострофом. Спасибо - person gillers322; 16.05.2017
comment
Я только что добавил скриншот данных - по сути, хотя столбцы представляют собой данные Twitter для нескольких учетных записей: Отметка времени | Имя учетной записи пользователя | Твиты | Подписчики | Далее - данные импортируются каждые 60 минут, и мне просто нужен способ добавить метку времени - person gillers322; 16.05.2017
comment
Спасибо @Tanaike - это почти идеально. Единственная проблема сейчас заключается в том, что при добавлении новых данных обновляется предыдущая метка времени, поскольку обновляется формула =now(). - person gillers322; 16.05.2017
comment
Да. При повторном открытии электронной таблицы =NOW() также обновляется до текущего времени. Если вы хотите исправить время импорта данных, оно импортируется в виде строки. Я только что обновил свой ответ как добавленный 2. Пожалуйста, подтвердите и выберите его для вашей ситуации. - person Tanaike; 17.05.2017
comment
Добро пожаловать. И тебе спасибо. - person Tanaike; 17.05.2017