質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

配列で格納したデータをスプレッドシートに書き込みたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 247

ushir

score 1

前提・実現したいこと

GASでスプレッドシート①にあるデータを統合、一部データは加工。
加工したデータはシート①の元データに上書きし、
更新後のデータをシート②の該当箇所に書き込みたいです。

発生している問題・エラーメッセージ

エラーが発生し、作業が完了できない状態です。

パラメータ(number[])が SpreadsheetApp.Range.setValues のメソッドのシグネチャと一致しません。

該当のソースコード

function accountupdate() {

  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = objSpreadsheet.getSheetByName("組織情報紐付け用");
  var subSheet = objSpreadsheet.getSheetByName("社員一覧");

  SpreadsheetApp.setActiveSheet(subSheet);

  //「組織情報紐付け用」シートのデータをクリア
  var clearRange = objSheet.getRange("T2:Y5000");
  clearRange.clearContent();  


  //「社員一覧」シートのデータ行数取得
  var sublastRow = subSheet.getLastRow();


    var now = new Date();
    var nowY = new Date(now.getFullYear());
    var Y1 = new Date(now.setFullYear(now.getFullYear() - 1));
    var Y3 = new Date(now.setFullYear(now.getFullYear() - 2));
    var Y6 = new Date(now.setFullYear(now.getFullYear() - 3));
    var nowM = new Date(now.setMonth(3));
    var nowD = new Date(now.setDate(1));

    var nowYMD = new Date(nowY, nowM.getMonth(), nowD.getDate());
    nowYMD = Utilities.formatDate(nowYMD,"Asia/Tokyo","yyyy/MM/dd");

    var Y1before = new Date(Y1.getFullYear(),nowM.getMonth(), nowD.getDate());
    Y1before = Utilities.formatDate(Y1before,"Asia/Tokyo","yyyy/MM/dd");

    var Y3before = new Date(Y3.getFullYear(),nowM.getMonth(), nowD.getDate());
    Y3before = Utilities.formatDate(Y3before,"Asia/Tokyo","yyyy/MM/dd");

    var Y6before = new Date(Y6.getFullYear(),nowM.getMonth(), nowD.getDate());
    Y6before = Utilities.formatDate(Y6before,"Asia/Tokyo","yyyy/MM/dd");

  var values = [];
  values = subSheet.getRange('A2:V2000').getValues();


  for(var k = 0; k <= sublastRow-2; k++){

    var ym_s = values[k][10];
    var ym = new Date(ym_s);
    ym = Utilities.formatDate(ym,"Asia/Tokyo","yyyy/MM/dd");



    //社歴振り分け
    if(Y1before < ym && ym >= nowYMD){

      values.splice(12, 1, "入社1年目");
    }

    else if(Y3before < ym && ym <= Y1before){

      values.splice(12, 1, "入社2~3年目");
    }

    else if (Y6before < ym && ym <= Y3before){

      values.splice(12, 1, "入社4~6年目");
    }

    else{

      values.splice(12, 1, "入社7年目以降");
    }


    //職位名称統合    
    if(values[k][9] == "取締役" || values[k][9] == "代表取締役" || values[k][9] == "監査役"){

      values.splice(9, 1, "役員");

    }

    else if(values[k][9] == "Fellow"){

      values.splice(9, 1, "Vice President");

    }

    else{
      continue;
    }

    var lastRow = values.length; 
    var lastColumn = values[0].length;

    subSheet.getRange(2,1,lastRow,lastColumn).setValues(values);

  }

      //「組織情報紐付け用」シートのデータ行数取得
  var objlastRow = objSheet.getLastRow();

  for(var i = 2; i <= objlastRow; i++){

    //VLOOKUPでデータ取得
    div = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,15,FALSE),"")';
    objSheet.getRange(i, 20).setFormula(div);

    dept = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,16,FALSE),"")';
    objSheet.getRange(i, 21).setFormula(dept);

    Class = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,10,FALSE),"")';
    objSheet.getRange(i, 22).setFormula(Class);

    office = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,19,FALSE),"")';
    objSheet.getRange(i, 23).setFormula(office);

    EmpClassification = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,9,FALSE),"")';
    objSheet.getRange(i, 24).setFormula(EmpClassification);

    hireDate = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,11,FALSE),"")';
    objSheet.getRange(i, 26).setFormula(hireDate);

    term = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,13,FALSE),"")';
    objSheet.getRange(i, 27).setFormula(term);

    enSpeaker = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,21,FALSE),"")';
    objSheet.getRange(i, 28).setFormula(enSpeaker);

    Co = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,22,FALSE),"")';
    objSheet.getRange(i, 29).setFormula(Co);    

  }  
}  

試したこと

subSheet.getRange(2,1,lastRow,lastColumn).setValues(values);
subSheet.getRange(2,1,lastRow,lastColumn).setValues([values]);に変更→変わりませんでした。

もともとは配列を使わずgetRange().setRange()にしていたのですが、
処理時間が長すぎて処理が完了せず…。

補足情報(FW/ツールのバージョンなど)

subSheet.getRange(2,1,lastRow,lastColumn).setValues(values);
を追加したことで上記エラーメッセージが表示されるようになりました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

質問の件名は 「配列で格納したデータをスプレッドシートに書き込みたい」ですが、
コードミスは for文内の配列処理じゃないでしょうか?

検証してませんが、 values.splice の部分は 全て values[k].splice ではないかと思います。

データ範囲を小さくして ログをとる、デバッグで動かしてみる等で確認されることをお勧めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/13 08:55

    回答ありがとうございます!
    ご指摘の通りfor文内の配列処理が間違っており、該当のエラーは解消することができました。
    ただ、次は「Exception: データの列数が範囲の列数と一致しません。データは 22 列ですが、範囲は 23.列です。」というエラーが発生、範囲の列数を変更しても解消できず…。
    自分ではどこがおかしいのか見つけられず…お手を貸していただけるとありがたいです。

    キャンセル

  • 2020/07/13 09:40 編集

    質問文に現在のエラーが出ている修正後のコードを貼っていただけますか。(元のコードは消さずに追加で)

    キャンセル

  • 2020/07/20 08:57

    すみません、一部修正しきれておらずエラーが出ていただけでした。
    最初に指摘いただいたコードミスの修正で意図通りの挙動になること確認できました。
    ありがとうございます…!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る