@ Купер, спасибо за предложенное решение, я еще не пробовал его, но попробую.
После небольшого обдумывания и исследования, эта статья Google была действительно полезной , я подумал, что было бы легче разделить то, что я хотел сделать, на разные функции и разыграть передачу.
function createHTML(data){
var t = HtmlService.createTemplateFromFile('template');
t.data = data;
sendEmail(t.evaluate().getContent());
}
function sendEmail(htmlBody){
var mailAddy = "email addy";
MailApp.sendEmail({
to:mailAddy,
subject: 'Test Email markup - ' + new Date(),
htmlBody: htmlBody,
});
}
function getData(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");
var range = sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn());
var values = range.getValues();
for (var i = 0; i < values.length; i++){
var data = values[i];
createHTML(data);
}
}
Функция getdata получает строку данных, которую я хочу использовать, из электронной таблицы, а затем передает ее в createHTML, который создает HTML-текст сообщения. это решает мою блокировку попыток перебрать данные либо с помощью кода Google или HTML.
Затем он передает результаты в функцию sendEmail для отправки электронного письма.
это была функция createHTML, которая изменила правила игры. Объявление t.data в файле .gs и передача значений в html способом, который я знаю, означало, что я мог бы перебрать свой массив. Если это имеет какой-то смысл.
Это было мое решение, но, конечно, я открыт для всех способов сделать это и спросить, почему х лучше.
Необходимо циклично выполниться через и свободный каждый созданный объект.
Необходимо знать, то объявление, что массив TMySubInfo на самом деле не создает объекты. Необходимо создать их позже.
Я использовал бы TList вместо этого для более динамического подхода. Вы могли даже использовать TObjectList, который может освободить все его объекты, когда список освобожден.
Необходимо освободить каждый объект, как это
destructor TMyInfo.Destroy;
var
I: Integer;
begin
for I:= Low(SubInfo) to High(SubInfo) do
SubInfo[I].Free;
SetLength(SubInfo, 0);
inherited;
end;
Вы освобождаете объекты тем же путем, Вы выделили их. Если Вы присвоили значение элемента путем называния конструктора класса, то свободным объект ссылаемый тем элементом.
destructor TMyInfo.Destroy;
var
info: TMySubInfo;
begin
for info in SubInfo do
info.Free;
inherited;
end;
Это использует синтаксис, представленный в Delphi 2005. Если у Вас есть более старая версия, используйте явную переменную цикла:
var
i: Integer;
begin
for i := 0 to High(SubInfo) do
SubInfo[i].Free;
Вы не должны звонить SetLength
в конце. Поле динамического массива как SubInfo
выпущен автоматически, когда объект уничтожается. Это работает то же интерфейсом, строкой и полями Variant.
При создании объектов через вызовы конструктора необходимо выполнить вызовы к Свободному для освобождения их. В противном случае Вы не делаете.
Согласованный со всеми вышеупомянутыми предложениями, но я хочу добавить (по общему признанию несколько анальную) рекомендацию, что Вы всегда называете FreeAndNil () процедурой в предпочтении к Бесплатному методу.
Рано или поздно Вы случайно получите доступ к объекту, который Вы уже освободили. Если у Вас есть привычка к FreeAndNil-лугу все, то Вы получаете непосредственный a/v на строке, которая содержит проблему. Если Вы просто Free'd объект, Вы, вероятно, получите таинственный и по-видимому не связанный отказ некоторое время спустя...
Это могло бы казаться маниакальным в контексте деструктора, как здесь. Хорошо, это немного, но или каждый делает это везде или нисколько.
Это тоже анально, но вроде как освободить в порядке, обратном созданию, например:
For I := List.Count-1 downto 0 do
List[I].Free;
Я рассматриваю создание и разрушение как паретез (), хотя это делает небольшое фактическое выполнение. Bri