Не кодировать строки напрямую; пусть писатель позаботится об этом. Например, этот код:
import csv
data = [chr(0x03d5) + 'oo', 'b' + chr(0x0101) + 'r']
with open('test.csv', 'w') as f:
writer = csv.writer(f)
for item in data:
writer.writerow([item])
записывает файл
ϕoo
bār
с кодировкой UTF-8 (по крайней мере, в моей системе, где locale.getpreferredencoding(False)
возвращает 'UTF-8'
]). Чтобы сделать кодировку явной, вы можете установить кодировку в вызове open
:
with open('test.csv', 'w', encoding='utf8') as f:
Если последняя строка изменена на writer.writerow([item.encode('utf')])
(которая преобразует строки в bytes
), он производит
b'\xcf\x95oo'
b'b\xc4\x81r'
В вашем примере попробуйте изменить эту строку:
writer.writerow({i:v.encode('utf') for i,v in t.items()})
на следующее:
writer.writerow(t)
Тогда, если это сработает, вы может заменить это:
for t in test_text
writer.writerow({i:v.encode('utf') for i,v in t.items()})
с
writer.writerows(test_text)
Я думаю, это то, что вы ищете. Вам нужно использовать правильную функцию getRange (), которая определяет размеры диапазона; тот, который принимает только два аргумента, всегда возвращает одну ячейку.
Программа также устанавливает цвет фона для ясности в том, что диапазон на самом деле.
Это также установит выбор, но вы, возможно, захотите понять связь между диапазонами и Классом выбора
function addSong(song) {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow()
sheet.appendRow([lastRow+1,song]);
var range = sheet.getRange(sheet.getLastRow(), 1);
// getRange(row, column, numRows, numColumns)
var range = sheet.getRange(sheet.getLastRow()-1, 1, 2, 2);
SpreadsheetApp.setActiveRange(range);
range.setBackground('green');
}
function test() {
addSong("Stairway to Heaven");
}
Вы можете попробовать SpreadsheetApp.flush ().
function addSong() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow()
sheet.appendRow([lastRow+1]);
SpreadsheetApp.flush();
var range = sheet.getRange(sheet.getLastRow(), 1);
SpreadsheetApp.setActiveRange(range);
}
Это должно сбросить электронную таблицу и сделать изменения правильными, а не ждать, пока скрипт завершит добавление этой последней строки.