2015-04-09 3 views
0

Я написал сценарий, который должен скопировать данные из одной таблицы в другую вместе с меткой даты.Добавить данные с одного листа на другой с отметкой даты

Я не могу этого добиться, вы можете помочь мне с этим, поскольку я новичок в написании сценариев.

function triggerOnTime() { 
    var SpreadSheetKeyA = "MY key"; 
    var SpreadSheetKeyB = "MY key"; 
    var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet(); 
    var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getActiveSheet(); 
    var data = sheet1.getRange(5,11,10,5).getValues(); 
    var time = new Date(); 
    var array = []; 
    for (var y = 1; y < data.length; y++) { 

    for (var x = 0; x < 5; x++){ 
     array.push(data[y][x]); 
    } 
     sheet2.appendRow([time,array]); 
     array = []; //reset the array contents 
     } 
} 

таблица-1: представления данных в электронной таблице-1,

Name  apple android windows linux 
Germany 3  4   6   7 
America 4  1   6   2 
Sweden  1  6   1   6 
Paris  5  0   2   4 

таблицы-2: Данные присутствуют в электронной таблице-2,

Date Name apple android windows linux 

Данных присутствуют в spreadsheet- 1 меняется каждый день. Я хотел бы сделать резервную копию данных в таблицу-2, когда новые данные присутствуют в электронной таблице. Это похоже на создание журнала данных каждый день с отметкой даты.

+0

Объясните подробно, что не работает. –

+0

сейчас я попытался объяснить, пожалуйста, пройдите через это. – ashwaqar

+0

№ Проблема ясна. Объясните exaccty, что не работает с показанным кодом. –

ответ

0
function triggerOnTime() { 
    var SpreadSheetKeyA = "MY key"; 
    var SpreadSheetKeyB = "MY key"; 
    var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getSheetByName("Source Name"); 
    var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getSheetByName("Target Name"); 
    var data = sheet1.getRange(5,11,10,5).getValues(); 
    var time = new Date(); 
    for (var r = 0; r < data.length; r++) { 
    data[r].unshift(time); 
    sheet2.appendRow(data[r]); 
    } 
} 

данные [r] .unshift (время); добавляет время к началу массива строк перед добавлением к sheet2.

Если в каждом прогоне скрипта appendRow() не будет использоваться значительное количество добавлений к листу2, то он не должен использоваться внутри цикла, и массив должен быть изменен, а затем добавлен в лист2 за одну операцию, как показано ниже:

function triggerOnTime() { 
    var SpreadSheetKeyA = "MY key"; 
    var SpreadSheetKeyB = "MY key"; 
    var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getSheetByName("Source Name"); 
    var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getSheetByName("Target Name"); 
    var data = sheet1.getRange(5,11,10,5).getValues(); 
    var time = new Date(); 
    for (var r = 1; r < data.length; r++) { 
    data[r].unshift(time); 
    } 
    sheet2.insertRowsAfter(sheet2.getLastRow(), data.length); 
    sheet2.getRange(sheet2.getLastRow()+1, 1, data.length, data[0].length).setValues(data); 
} 

Вы должны использовать getSheetByName() вместо getActiveSheet(). Даже если он работает, теперь добавление листа позже может испортить работу при использовании триггеров.

+0

ваш скрипт отлично подходит для меня, но небольшое усовершенствование - я добавил: var time = new Date() .toJSON(). slice (0,10); ' – ashwaqar

+0

Я также хотел бы удалить пустые строки, которые обновляются в листе2 из диапазона, заданного в 'var data = sheet1.getRange (5,11,10,5) .getValues ​​();' – ashwaqar

+0

, что является отдельным вопросом. Вы должны отметить это и ответить на новый вопрос твой новый код. – ScampMichael

0

Вам нужно добавить время внутри массива, а не как другой параметр в appendrow. То есть array.push (время) перед вызовом appendRow. Или нажмите его в начале массива, если вы хотите, чтобы он был первым столбцом.
также рассмотрим другой ответ, который показывает, как оптимизировать vy, выполняя один вызов api, но вам нужно будет изменить массив, чтобы иметь метку времени.

+0

спасибо за ваш скрипт, но сценарий, данный ScampMichael, работает отлично для меня. \t Я также хотел бы удалить пустые строки, которые обновляются на листе2, из диапазона, заданного в 'var data = sheet1.getRange (5,11,10,5) .getValues ​​();' – ashwaqar

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