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

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

ただいまの
回答率

89.13%

GASでテンプレを一括翻訳するコードを作りましたが処理に時間がかかるとの提示がありました

解決済

回答 1

投稿

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

koroaisu

score 8

前提・実現したいこと

カスタマーサポートを対応する際に、日本語で頂いた情報をテンプレで記入したモノを別の言語に翻訳する必要があります。
そのため、テンプレの翻訳コードを作りましたが、処理に大変時間がかかると表示されていましたので、処理速度をアップする方法をご教授いただきたいです。

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

Method Range.getValue is heavily used by the script.
File: TempTranslate_test2 Line: 19

該当のソースコード

var SS_ChangeTempLanguage=SpreadsheetApp.openById('リンク先');
var Translate_sheet = SS.getSheetByName('対応シート名');  //対応シート名
var Dict_sheet = SS.getSheetByName('dict');  

var JPTemp_VauleColumn = 6; // テンプレ欄
var CHTemp_TranslateColumn = 8; // テンプレ翻訳欄
var ClassficationColumn = 10; // 分類欄
var CSstatusColumn = 11;  // 対応ステータス欄

var JPtempDict_VauleColumn = 1; // 日本語のテンプレ
var CHtempDict_VauleColumn = 2; // テンプレ対応翻訳

function TempTranslate_Procedure () {
  var JPTemp_DictVaule = getColumnArrayData_Auto (Dict_sheet, JPtempDict_VauleColumn);
  var CHTemp_DictVaule = getColumnArrayData_Auto (Dict_sheet, CHtempDict_VauleColumn);
  var Translate_sheetLastCol=Translate_sheet.getLastRow();

  for(var c=0;c<Translate_sheetLastCol;c++){
    var ClassficationValue=Translate_sheet.getRange(c+2,ClassficationColumn).getValue();
    var SetTempCellVaule=Translate_sheet.getRange(c+2,CHTemp_TranslateColumn).getValue();
    var CSstatus=Translate_sheet.getRange(c+2,CSstatusColumn).getValue();
    if(ClassficationValue=="アカウント紛失" || ClassficationValue=="不具合"||ClassficationValue=="課金関連" ){  //テンプレのある欄のみ処理を行う

      if(SetTempCellVaule=="" && CSstatus=="確認待ち"){  //誤ってデータを上書きしないよう、対応ステータスが確認待ち、かつテンプレ翻訳欄が空欄
        var JPTempVaule=Translate_sheet.getRange(c+2,JPTemp_VauleColumn).getValue();
        var TranslatedTemp=JPTempVaule;

        for (var k = 0; k < JPTemp_DictVaule.length; k++) {
          TranslatedTemp = TranslatedTemp.replace(JPTemp_DictVaule[k][0], CHTemp_DictVaule[k][0]);
        }

        Translate_sheet.getRange(c+2,CHTemp_TranslateColumn).setValue(TranslatedTemp);    
      }

    }

  } 
}

function getColumnArrayData_Auto (targetSheet, startColumn) {
  var lastRow = targetSheet.getLastRow();
  var range = targetSheet.getRange(1,startColumn, lastRow,1);
  var values = range.getDisplayValues();
  return values;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

動くデータを用意するのが面倒だったので、テストしていません。
(コードの最適化もしていません)
※必ずテスト環境でテストしてから適用してくださいね。

for中にあるgetRange()getValue(),setValue()をすべて廃止しています。
先にTranslate_sheetのデータをArrayに取得し、全てArrayで処理しています。

注意としては、これはgetValues()したデータで処理しますので、(そんな時間かかるとは思えませんが)関数実行中のシートの変更内容は反映されません。

function TempTranslate_Procedure () {
    var newCHTemp_TranslateColumnArray = [];
    var JPTemp_DictVaule = getColumnArrayData_Auto (Dict_sheet, JPtempDict_VauleColumn);
    var CHTemp_DictVaule = getColumnArrayData_Auto (Dict_sheet, CHtempDict_VauleColumn);
    var Translate_sheetValues = Translate_sheet.getDataRange().getValues();

    for(var i=1;i<Translate_sheetValues.length;i++){
      var ClassficationValue=Translate_sheetValues[i][ClassficationColumn - 1]; // 配列は行列番号と1つずれる
      var SetTempCellVaule=Translate_sheetValues[i][CHTemp_TranslateColumn - 1];
      var CSstatus=Translate_sheetValues[i][CSstatusColumn - 1];
      if(ClassficationValue=="アカウント紛失" || ClassficationValue=="不具合"||ClassficationValue=="課金関連" ){  //テンプレのある欄のみ処理を行う

        if(SetTempCellVaule=="" && CSstatus=="確認待ち"){  //誤ってデータを上書きしないよう、対応ステータスが確認待ち、かつテンプレ翻訳欄が空欄
          var JPTempVaule=Translate_sheetValues[i][JPTemp_VauleColumn - 1];
          var TranslatedTemp=JPTempVaule;

          for (var k = 0; k < JPTemp_DictVaule.length; k++) {
            TranslatedTemp = TranslatedTemp.replace(JPTemp_DictVaule[k][0], CHTemp_DictVaule[k][0]);
          }
          newCHTemp_TranslateColumnArray.push([TranslatedTemp]);
        } else {
          newCHTemp_TranslateColumnArray.push([SetTempCellVaule]);
        }
      } else {
        newCHTemp_TranslateColumnArray.push([SetTempCellVaule]);
      }
    }
    Translate_sheet.getRange(2, CHTemp_TranslateColumn, newCHTemp_TranslateColumnArray.length).setValues(newCHTemp_TranslateColumnArray);
  }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/18 12:33

    頂いたコードをテストしまして、正常に作動しましたので、大変助かりました。
    ご教授いただき、誠にありがとうございます。

    キャンセル

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

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