1

Я пытаюсь выполнить функцию «roman-number-to-decimal-number» в Google Spreadsheets. До сих пор мне удалось заставить его работать, используя код ниже:Функция «замена» Google Script с диапазоном

function rom2num(inputRange) { 
inputRange = inputRange.replace(/\bi\b/gi,1); //convert 'I' to '1' 
    return inputRange; 
} 

Это отлично работает, когда вход только одна ячейка. Тем не менее, всякий раз, когда я пытаюсь ввести диапазон (A1: B2), я получаю сообщение об ошибке: «невозможно найти функцию замены в объекте».

Некоторые примеры того, что я хочу добиться:

Column A  | Column with function 
i, ii, iii | 1, 2, 3 
Godfather II | Godfather 2 
iv, v, vi  | 4, 5, 6 
Star Wars V | Star Wars 5 

Я мог бы просто выбрать, чтобы повторить функцию ниже клеток, как это было предложено Crayon, однако, диапазон, который должен быть переформатирован может быть 50 строк , или это может быть 100 строк, и я предпочитаю не бросать в 50 дополнительных экземпляров функции, если они не будут использоваться. Я хочу, чтобы он был максимально автоматическим. :-)

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

function copyRange(inputRange) { 
return inputRange; 
} 

Так для ввода диапазон и выход того же диапазона не проблема. Проблема заключается в том, чтобы включить функцию replace. Мне удалось изменить информацию во всем диапазоне, используя функцию 'toString()'. И тогда я смог разделить вывод на несколько столбцов, используя «split» («,»), но я не хочу, чтобы он распространялся по столбцам, просто по строкам.

Так что, если я какой-то образом могу преобразовать диапазон/массив в строку, а затем обратно в диапазоне/массив ...

Можно ли добиться этого без вздутия коды слишком много? (Я новичок в сценариях и предпочитаю, чтобы мои сценарии были короткими, как мой пример выше.)

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

Спасибо!

РЕДАКТИРОВАТЬ: наконец-то понятые вещи были слишком сложными, поэтому я просто пошел с советом Crayons и использовал метод «перетаскивания». Меня спасло много шума. Спасибо за помощь!!

+1

Итак, что * * в переменной 'inputRange', то, если это не строка? Добавьте тип (как указано в 'typeof inputRange') и содержимое этой переменной. Это вовсе не проблема с скриптом Google, просто простой JavaScript, но трудно помочь, не зная, что в этой переменной. :-) –

+0

Привет! Спасибо за быстрый ответ. Я отредактировал сообщение, чтобы, надеюсь, принести больше ясности в ситуацию и ответить на ваш вопрос. Благодаря! – user2268171

+0

Эй, сейчас слишком много деталей. :-) Действительно, вы делаете это слишком сложным. Давай начнем сначала. У вас есть функция. Он принимает входные данные и преобразует их в вывод. Что это такое? Какой результат должен генерировать этот вход? Дайте конкретные примеры для обоих, как много примеров, как это требуется, чтобы показать различные случаи, с которыми вы можете столкнуться, но не более того. Забудьте о API таблиц и обо всем остальном, все это просто отвлекает. Подойдите к минимальным конкретным требованиям для этой конкретной функции, а затем у вас есть что-то, что легко решить. –

ответ

2

в соответствии с https://developers.google.com/apps-script/execution_custom_functions ваша функция может только изменять данные в ячейке, в которую вызывается функция, поэтому вы не должны пытаться изменять несколько ячеек в любом случае. У вас должна быть функция сделать замену для этой ячейки, а затем применить функцию к нескольким ячейкам.

Например

A B 
i =rom2num(A1) 
i 
i 
i 

Это позволит сделать B1 равным "1". Теперь держите мышь над B1, а в правом нижнем углу - точка, перетащите вниз до B4, и вы увидите функцию, применяемую к строкам B2-4.

редактировать:

В свете Вашего комментария и дополнительной информации в вашем вопросе, я думаю, я знаю, что вы пытаетесь сделать. В основном вы хотите использовать переполнение значения для ячеек, чтобы эффективно действовать на несколько ячеек. Так что да, это возможно, возвращая двойной массив. Ваш новый пример показывает converting roman numerals to actual numbers ..ну, это немного сложнее, чем просто делать .replace, но вы должны быть в состоянии выяснить, как работать с этим материалом в то, что вы пытаетесь сделать, как только вы поймете, как заставить ценности работать! Так вот как это сделать:

function rom2num(inputRange) { 
    var cells = []; 
    for (var i=0;i<inputRange.length;i++) { 
    cells[i] = [String(inputRange[i]).replace(/i/gi,1)]; 
    } 
    return cells; 
} 

Этот пример здесь итерацию каждой строки в диапазоне, а просто заменяет «я» с «1». Затем он возвращает двойной массив значений, так, например, если у вас есть

A    B 
i, ii, iii  =rom2num(A1:A4) 
Godfather II 
iv, v, vi 
Star Wars V 

Функция возвратит и переливаться клетки выглядеть следующим образом:

A    B 
i, ii, iii  1, 11, 111 
Godfather II Godfather 11 
iv, v, vi  1v, v, v1 
Star Wars V  Star Wars V 

Как я уже говорил, вы будете вам нужно сделать больше, чем просто .replace (перейдите по ссылке, которую я вам предоставил), чтобы фактически преобразовать римские числа в числовые номера, но что касается вашего фактического вопроса, это должно сделать это.

редактировать 2:

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

function rom2num(inputRange) { 
    var cells = []; 
    for (var i=0;i<inputRange.length;i++) { 
    cells[i] = [ 
     String(inputRange[i]).replace(/\b([ivxcldm]+)\b/gi,function(p,p1) { 
     return deromanize(p1); 
     }) 
    ]; 
    } 
    return cells; 
} 

function deromanize (str) { 
    var str = str.toUpperCase(), 
     validator = /^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/, 
     token = /[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, 
     key = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}, 
     num = 0, m; 
    if (!(str && validator.test(str))) 
     return false; 
    while (m = token.exec(str)) 
     num += key[m[0]]; 
    return num; 
} 

То же самое, как и раньше ... колонка А имеет материал, который вы хотите, чтобы действовать на, положить =rom2num(A1:A4) в первую ячейку столбца B. Это будет поместите преобразованные римские цифры в каждую ячейку столбца B, выстроившись в ячейку столбца A. Но помните, что на самом деле это не изменяет отдельные ячейки An> Bn. Это действительно захватывает диапазон, который вы указываете, и переполняет результаты в несколько ячеек. Он эффективно делает то, что вы хотите, но это не совсем то же самое.

+0

Привет! Спасибо за указание я на эту страницу.Он содержал некоторую информацию о возвращении массивов, которые могут быть тем, что я должен делать. На самом деле я не пытаюсь изменить исходные данные, я просто хочу получить данные, а затем вывести их вариант в другой ячейке ,Причина того, что вы не хотите использовать метод drag-drag, состоит в том, что содержимое в исходном диапазоне может меняться и содержать больше или меньше строк. – user2268171

+0

Hey @ user2268171 благодарит за комментарий, а также обновите свой вопрос. Я думаю, что понимаю, что вы сейчас пытаетесь сделать, и обновил свой ответ, чтобы отразить это. Надеюсь это поможет! –

+0

@ user2268171 Я снова обновил свой ответ. Мне было любопытно увидеть конечное решение, поэтому я пошел вперед и добавил функцию преобразования чисел с римскими цифрами. Поскольку я сделал это, я решил, что может спасти вас от неприятностей. –

Смежные вопросы