1

Googleフォームを介してアクティビティが入力されたGoogleシートがあります。フィールドの1つは活動日フィールドです。完了後、アクティビティはappendrowを介してレポート目的で別のシートに移動されます。ピボットテーブルの集団を助けるためにGoogle Appsスクリプトは、appendrowを介して追加された行の行番号を必要とするセル数式を設定します。

var cells = [activityDate, title, completionDate, ...]; 
destsheet.appendRow (cells); 

、先のスプレッドシートの列の一つは、下記一般式=Text(A1, "MMMM")を介して行われる目的をグループ化するための活動の月です。私が持っている問題は、 "行"を完全に埋めることです、私は行先シートに追加された行の行番号を知る必要があります。たとえば、行89を追加すると、行の式を= Text(A89、 "MMMM")に設定できます。私が実行している問題は、appendRowがアトミックな間に、追加された行ではなくワークシートを返すことです。

appendRowの後にgetRangeで行を取得できたのですが、別のユーザーがappendRowとgetRangeの呼び出しの間に行を挿入する可能性があります。私は "=テキスト(Indirect(Address(Row()、1、4))、" MMMM ")"という列の式を変更して問題を解決しました。これは、報告目的のための活動日の適切な形式の月を取得します。スプレッドシートに精通していない人にとって、私のソリューションに使用している式はちょっと混乱します。

アトミックトランザクションでappendRowを取得する方法はありますか?したがって、「行」番号に依存する行のセルを正しく構成できますか?

+0

使用[ロックサービス](https://developers.google.com/apps-script/reference/lock/lock-service) – Cooper

答えて

0

これはいかがですか?ターゲットシート内の空の行をすべて削除し、追加行関数で行を追加するのと同じトランザクションでgetMaxRows()メソッドを呼び出します。 Google appscriptは同期式なので、最大行情報を取得するのに瞬間に別の行を挿入できません。

function appendRow() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('Sheet1'); 
    var row = sheet.appendRow(['Some data']) 
    Logger.log(row.getMaxRows()) 
} 
+0

>別の行は、それが最大を得るために取る瞬間に挿入することができません行情報 残念ながら、これは当てはまりません。とにかくソリューションは使いやすいです – Kos

+0

私は忙しかったし、代わりの方法を研究する時間がありませんでした。私のレポートシートには余分な行がないので、getMaxRows()はちょうど追加した行を返します。私がよく慣れていないのは、Googleがマルチユーザーアクセスを処理する方法です。同じスプレッドシートに複数のユーザーがいます。私は上記のようなことをすることを考えていました。私の恐れはユーザー 'A'で行を追加し、ユーザー 'B'はユーザー 'A'のgetMaxRows()を呼び出す前に行を追加します。 – BrianScheffer

+0

上記のケースは技術的に可能であると考えられます。 したがって、解決策として、固有のキー列を使用することをお勧めします。これは、ユーザーが行を追加するときに一意のインデックスキーが生成されるということです。 キーは、ユーザー名+すでにシート上にあるキーの増分で構成できます。 他のユーザは、固有のユーザ名に数字を加えたものが含まれているため、一意のIDを持っているコールの間に行を置いています。それ以降のコールでは、一意のIDが検索されます。 –

関連する問題