#javascript #html #css #google-apps-script #number-formatting
#javascript #HTML #css #google-apps-script #форматирование чисел
Вопрос:
У меня есть таблица из 2 столбцов в Google Sheet. 2-й столбец состоит из платежей, значения которых могут меняться в зависимости от ввода пользователем через Google form и суммирования с использованием GAS.
Затем эта таблица gsheet будет преобразована в html с помощью GAS и отправлена по электронной почте в виде отчета. При преобразовании таблицы gsheet в html строки данных фильтруются для отображения только строк данных, для которых 2-й столбец не является нулевым значением. Благодаря @Tanaike, скрипт фильтрации, как показано ниже:
var tableRangeValues=xtraqsheet.getRange(2,1,5,2).getDisplayValues();
var forhtmlemail=HtmlService.createTemplateFromFile("extrasvcitem");
forhtmlemail.tableRangeValues = tableRangeValues.filter(([,b]) => b.toString()!=0 amp;amp; b.toString()!='0' amp;amp; b.toString()!='' amp;amp; b.toString()!='RM - ' amp;amp; b.toString()!='-');
Критерии фильтрации, объявленные в приведенной выше строке кода, похоже, не работают, когда я меняю формат валюты платежей на пользовательский формат, который совпадает с форматом учета по умолчанию в excel / gsheet, где символ валюты всегда будет отображаться в крайнем левом углу ячейки, а цифры всегда будут отображаться в таблице.отображается в крайнем правом углу ячейки. Результат, который я ожидал, выглядит следующим образом (в формате html). Я хочу поддерживать тот же пользовательский формат и просто показывать ненулевые строки данных:-
мой html-код для этой таблицы :-
<tbody style="border-style: none solid solid;border-color: #3E1176">
<?tableRangeValues.forEach((r,i)=>{
let color;
if(i%2===0){color="white"}else{color="#F6EFFE"}?>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:<?=color?>;">
<td style="width: 52.7272%;"><?=r[0]?></td>
<td style="width: 36.0039%;"><?=r[1]?></td>
</tr>
<?})?>
</tbody>
Достижимо ли это? Я попытался вставить accounting.js сценарий библиотеки в теле html, но это привело к пробелам для всех строк. Был бы признателен за помощь. Спасибо.
Комментарии:
1. Чтобы правильно понять вашу текущую ситуацию и вашу цель, можете ли вы предоставить образец электронной таблицы? К сожалению, я не могу понять ваши верхние и нижние изображения.
2. Я отредактировал содержание своего вопроса, мистер @Tanaike . Надеюсь, вам достаточно понимания моих целей. Спасибо.
3. Спасибо за ответ и добавление дополнительной информации. Исходя из информации, я предложил модифицированный скрипт в качестве ответа. Не могли бы вы подтвердить это, пожалуйста? Если это было не то направление, которое вы ожидали, я приношу свои извинения.
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Вы хотите добиться преобразования верхнего изображения в нижнее изображение с помощью Google Apps Script.
- В приведенной выше таблице столбец "B" отформатирован в числовом формате.
Точки модификации:
- К сожалению, я не могу понять весь ваш сценарий. Но я предполагаю, что вы можете извлекать значения с помощью
getValues()
. В этом случае я думаю, что форматированные значения не сохраняются. Итак, в вашем случае я хотел бы предложить использоватьgetDisplayValues()
вместоgetValues()
. При этом форматированные значения сохраняются.- Когда
getDisplayValues()
используется, значения можно проверить с помощью регулярного выражения.
- Когда
- И в вашем HTML тег of
<table></table>
не используется.
Когда вышеуказанные пункты отражены в вашем скрипте, это выглядит следующим образом.
Модифицированный скрипт:
Сторона скрипта Google Apps:
const sheetName = "Sheet1"; // Please set the sheet name.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);
const tableRangeValues = sheet.getRange("A2:B9").getDisplayValues();
const forhtmlemail=HtmlService.createTemplateFromFile("i17");
forhtmlemail.tableRangeValues = tableRangeValues.filter(([,b]) => !(/^[RM -] $/.test(b)));
const res = forhtmlemail.evaluate().getContent();
console.log(res)
- В этом примере скрипта значения извлекаются из ячеек "A2: B9" на "Sheet1". Поэтому, пожалуйста, измените это для вашей реальной ситуации.
- Если вы хотите включить заголовок, пожалуйста, измените
A2:B9
наA1:B9
.
Сторона HTML и Javascript:
<tbody style="border-style: none solid solid;border-color: #3E1176">
<table>
<?tableRangeValues.forEach((r,i,a)=>{
let color;
if(i%2===0){color="white"}else{color="#F6EFFE"}?>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:<?=color?>;">
<td style="width: 52.7272%;" align="<? if (i == a.length - 1) {?> <?='right'?> <? } else { ?> <?='left'?> <?}?>"><?=r[0]?></td>
<td style="width: 36.0039%; text-align-last: justify;">
<?!=r[1]?>
</td>
</tr>
<?})?>
</table>
</tbody>
Результат:
При использовании вышеизложенного модифицированного скрипта может быть получен следующий результат.
<tbody style="border-style: none solid solid;border-color: #3E1176">
<table>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:white;">
<td style="width: 52.7272%;" align=" left ">Custom packaging request</td>
<td style="width: 36.0039%; text-align-last: justify;"> RM 12,345.00 </td>
</tr>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:#F6EFFE;">
<td style="width: 52.7272%;" align=" left ">Change of license plate</td>
<td style="width: 36.0039%; text-align-last: justify;"> RM 1,234.00 </td>
</tr>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:white;">
<td style="width: 52.7272%;" align=" left ">Car wash mobile service</td>
<td style="width: 36.0039%; text-align-last: justify;"> RM 123.00 </td>
</tr>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:#F6EFFE;">
<td style="width: 52.7272%;" align=" left ">Personal drive service</td>
<td style="width: 36.0039%; text-align-last: justify;"> RM 20.00 </td>
</tr>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:white;">
<td style="width: 52.7272%;" align=" left ">Change of security ID</td>
<td style="width: 36.0039%; text-align-last: justify;"> RM 2.00 </td>
</tr>
<tr style="border-style: none solid;border-color:#3E1176;padding:10px;color:#3E1176;font-size:10pt;background-color:#F6EFFE;">
<td style="width: 52.7272%;" align=" right ">TOTAL</td>
<td style="width: 36.0039%; text-align-last: justify;"> RM 13,724.00 </td>
</tr>
</table>
</tbody>
Примечание:
- В приведенном выше сценарии предполагается, что столбец "B" вашей примерной таблицы задается числовым форматом like
RM 12,345.00
. Если это неверно, приведенный выше скрипт не может быть использован. Пожалуйста, будьте осторожны с этим.
Ссылки:
Комментарии:
1. Большое вам спасибо за такой подробный, рабочий и организованный ответ, @Tanaike! Работает как всегда!
2. @dell Спасибо за ответ. Я рад, что ваша проблема была решена. И вам спасибо.
3. Извините, что снова поднимаю этот вопрос, г-н @Tanaike . Хотелось бы понять, что это
a
представляет в этой строке HTML-кодаalign="<? if (i == a.length - 1) {?> <?='right'?> <? } else { ?> <?='left'?> <?}?>"
? Потому что, когда я попытался применить его в другой таблице с 4 столбцами вместо 2, кажется, что он не отображается так, как вы сделали для меня в ответе выше. Я пробовал использовать его в каждом<td style>
, но все равно без разницы. Спасибо.4. Или если кто-нибудь, кто знает и может поделиться более подробной информацией об этом, будет очень признателен. Tq!
5. Я обнаружил кое-что странное. Я удалил эту строку кода
align="<? if (i == a.length - 1) {?> <?='right'?> <? } else { ?> <?='left'?> <?}?>"
и просто сохранил<td style = "text-align-last:justify;"
, вывод по-прежнему выровнен так, как я хотел, чтобы это было раньше. Но этого не происходит с моей другой таблицей с большим количеством столбцов. Так странно .... 🙁
Ответ №2:
Вы пробовали toFixed
function в javascript?
(19085.57).toFixed(2).replace(/d(?=(d{3}) .)/g, '$amp;,'); // 19,085.57
Комментарии:
1. Извините, это не приведет к отображению RM таким, каким я хочу, чтобы он был.